试图让这个工作变得严重麻烦..刚刚开始NASM大会如此抱歉,如果这是一个问题的菜鸟,但任何帮助是值得赞赏的谢谢你!
尝试让两个变量渲染相等,以便cmp工作后跳转。这让我非常沮丧,因为直接值(如果一个mov eax和ebx是" 5")它的工作原理是一个地址问题?我不确定。
section .data
str_equal db "Equal!", 0xA
len_equal equ $ - str_equal
str_number_a db "5"
str_number_b db "5"
section .text
global _start
_start:
mov eax, [ str_number_a ]
mov ebx, [ str_number_b ]
cmp eax, ebx
je _Equal
jmp _Exit
ret
_Equal:
mov eax, 4 ; syscall - write()
mov ebx, 1 ; stdout
mov ecx, str_equal
mov edx, len_equal
int 0x80 ; Call dat Kernel
jmp _Exit
ret
_Exit:
mov eax, 1
mov ebx, 0
int 0x80
ret
答案 0 :(得分:1)
问题在于,当您尝试将字符串中的单个字节移动到寄存器中时,您正在使用32位数据填充32位寄存器:
mov eax, [ str_number_a ]
mov ebx, [ str_number_b ]
如果我们查看内存,可能会有超出字符串第一个字节的内容:
xx xx xx 35 1F 4A 59 xx xx xx
^ ^^^^^^^
'5' Garbage
由于eax
和ebx
是32位寄存器,因此它们同时读取字符' 5'和垃圾跟随。这是什么意思?自从垃圾记忆超越了角色' 5'在两个字符串中很可能会有所不同,eax
和ebx
之间的比较将始终不相等。
这可以通过将32位/ 4字节比较(cmp
)更改为8位/ 1字节(或单字符)比较来解决:
cmp byte eax, ebx
这样,只比较每个寄存器的第一个字节。
编辑:
或者,您可以使用8位寄存器来存储数据:
mov al, [ str_number_a ]
mov ah, [ str_number_b ]
cmp al, ah