Assembly nasm x86:64位除法的结果总是1

Assembly nasm x86:64位除法的结果总是1,assembly,x86,Assembly,X86,这可能是个愚蠢的错误,但我似乎在任何地方都找不到解决办法。 我试图将EDX:EAX除以EBX并显示商,但是每当我运行它时,我总是在EAX寄存器中得到1,不管数字是多少(只要它们是正数) 您忘记将输入从文本转换为数字。另外,您正在从一个只有2个字节的空间加载4个字节。这是一个好主意,但不会有多大帮助。这里最大的问题是,您在中从STD_读取了一个字符串,但您没有解析该字符串,而是将其重新解释为整数,Jester在第一条注释中也提到了这一点。对于单个数字,是的。然后您应该加载一个字节。SYS\u re

这可能是个愚蠢的错误,但我似乎在任何地方都找不到解决办法。 我试图将EDX:EAX除以EBX并显示商,但是每当我运行它时,我总是在EAX寄存器中得到1,不管数字是多少(只要它们是正数)


您忘记将输入从文本转换为数字。另外,您正在从一个只有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