比较 NASM 程序集中的变量
Comparing variables in NASM Assembly
尝试让它工作时遇到严重问题.. 刚开始 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
问题是当您尝试将字符串中的单个字节移动到寄存器中时,您正在用 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-bit/4 字节比较 (cmp
) 更改为 8-bit/1 字节(或单个字符)比较来解决:
cmp byte eax, ebx
这样,只比较每个寄存器的第一个字节。
编辑:
或者,您可以使用 8 位寄存器来存储数据:
mov al, [ str_number_a ]
mov ah, [ str_number_b ]
cmp al, ah
尝试让它工作时遇到严重问题.. 刚开始 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
问题是当您尝试将字符串中的单个字节移动到寄存器中时,您正在用 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-bit/4 字节比较 (cmp
) 更改为 8-bit/1 字节(或单个字符)比较来解决:
cmp byte eax, ebx
这样,只比较每个寄存器的第一个字节。
编辑:
或者,您可以使用 8 位寄存器来存储数据:
mov al, [ str_number_a ]
mov ah, [ str_number_b ]
cmp al, ah