Assembly nasm x86:64位除法的结果总是1
这可能是个愚蠢的错误,但我似乎在任何地方都找不到解决办法。 我试图将EDX:EAX除以EBX并显示商,但是每当我运行它时,我总是在EAX寄存器中得到1,不管数字是多少(只要它们是正数)Assembly nasm x86:64位除法的结果总是1,assembly,x86,Assembly,X86,这可能是个愚蠢的错误,但我似乎在任何地方都找不到解决办法。 我试图将EDX:EAX除以EBX并显示商,但是每当我运行它时,我总是在EAX寄存器中得到1,不管数字是多少(只要它们是正数) 您忘记将输入从文本转换为数字。另外,您正在从一个只有2个字节的空间加载4个字节。这是一个好主意,但不会有多大帮助。这里最大的问题是,您在中从STD_读取了一个字符串,但您没有解析该字符串,而是将其重新解释为整数,Jester在第一条注释中也提到了这一点。对于单个数字,是的。然后您应该加载一个字节。SYS\u re
您忘记将输入从文本转换为数字。另外,您正在从一个只有2个字节的空间加载4个字节。这是一个好主意,但不会有多大帮助。这里最大的问题是,您在中从STD_读取了一个字符串,但您没有解析该字符串,而是将其重新解释为整数,Jester在第一条注释中也提到了这一点。对于单个数字,是的。然后您应该加载一个字节。
SYS\u read
int 0x80
读取的程序集中的“字符串”是根据ASCII编码的字节值序列(即字体标志符号0的值'0'==48==0x30
)。如果用户输入123
,您将收到两个字节的值'1'
和'2'
('3'
丢失,因为edx=2
)。如果用户输入5
,您将收到两个字节的值'5'
和10
(换行符)。尝试在调试器中观察内存,并尝试输入不同的字符串和参数,以便更好地掌握它的工作原理以及输入数据。(然后从字符串中获取整数值12
“12”意味着('1'-'0')*10+('2'-'0')
)。哦,要输出结果,当然要做相反的转换,从eax
的32位中编码的数值整数值二进制到字符串,添加eax,48
仅适用于单个数字结果,例如,如果结果为17,则17+48=65,这是ASCII编码中的大写字母'A'
。如果您刚刚开始使用asm,那么最好推迟字符串操作,首先关注整数运算,通过源代码输入值(+重新编译并运行),通过调试器检查结果,跳过单个指令。
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STD_IN equ 0
STD_OUT equ 1
section .data
msg1 db 'Enter first number:', 0xA, 0xD
len1 equ $ - msg1
msg2 db 'Enter divisor:', 0xA, 0xD
len2 equ $ - msg2
msg3 db 'Result: '
len3 equ $ - msg3
msg4 db ' ', 0xA, 0xD
len4 equ $ - msg4
section .bss
num1 resb 2
num2 resb 2
res resb 2
section .text
global _start
_start:
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_READ
mov ebx, STD_IN
mov ecx, num1
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_READ
mov ebx, STD_IN
mov ecx, num2
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg3
mov edx, len3
int 0x80
xor edx, edx
mov eax, [num1]
cdq
mov ebx, [num2]
div ebx
add eax, byte 48
mov [res], eax
int 0x80
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, res
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg4
mov edx, len4
int 0x80
mov eax, SYS_EXIT
int 0x80