汇编字符串比较代码编译报错,求解决操作数组合无效等问题
修复汇编代码中的两个编译错误
错误1:cmp [di], [bx] 操作数组合无效
x86汇编指令集不支持直接比较两个内存地址中的值,必须先把其中一个内存值加载到寄存器,再和另一个内存值或寄存器值比较。比如可以把[di]读到al寄存器,再和[bx]比较:
mov al, [di] cmp al, [bx]
错误2:cmp [bx], 0 未指定操作数大小
汇编器无法判断你要比较的是字节、字还是双字,由于字符串是单字节字符,需要明确指定byte:
cmp byte [bx], 0
修改后的完整代码
enter: pusha mov ah, 0x0e mov al, 0x0a int 0x10 mov al, 0x0d int 0x10 popa mov di, reserved_string mov bx, string2 jmp loop1 loop1: cmp di, si je middle_loop1 ; 修复第一个错误:先把内存值读到寄存器再比较 mov al, [di] cmp al, [bx] jne go_back_loop1 inc di inc bx jmp loop1 go_back_loop1: mov si, reserved_string jmp key_press middle_loop1: mov bx, string2 pusha jmp print_ping print_ping: ; 修复第二个错误:指定操作数为字节 cmp byte [bx], 0 je go_back_print_ping mov ah, 0x0e mov al, [bx] int 0x10 inc bx jmp print_ping go_back_print_ping: popa jmp key_press
补充说明
- 字符串比较逻辑里的
cmp di, si是比较两个指针是否相等,请确保si确实指向reserved_string的结束位置(比如字符串末尾的0或预定长度的终止位置),避免出现越界或错误判断。 - int 0x10的0x0e功能是Teletype输出,每次输出一个字节,和我们指定的
byte操作数大小匹配,逻辑保持一致。
内容的提问来源于stack exchange,提问作者RadoslavL
相关产品推荐
相关产品推荐

