此代码是添加用户输入的两个数字的示例,如果用户输入的数字小于10,即5和4,它可以正常工作,但如果出现以下情况,则会产生ascii charachter:
下面的代码中有什么问题,所以它可以接受任何小数,即400 + 650
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
segment .data
msg1 db "Enter a digit ", 0xA,0xD
len1 equ $- msg1
msg2 db "Please enter a second digit", 0xA,0xD
len2 equ $- msg2
msg3 db "The sum is: "
len3 equ $- msg3
segment .bss
num1 resb 2
num2 resb 2
res resb 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, num1
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, num2
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
; moving the first number to eax register and second number to ebx
; and subtracting ascii '0' to convert it into a decimal number
mov eax, [number1]
sub eax, '0'
mov ebx, [number2]
sub ebx, '0'
; add eax and ebx
add eax, ebx
; add '0' to to convert the sum from decimal to ASCII
add eax, '0'
; storing the sum in memory location res
mov [res], eax
; print the sum
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, res
mov edx, 1
int 0x80 exit:
mov eax, SYS_EXIT
xor ebx, ebx
int 0x80
答案 0 :(得分:0)
你的程序实际上做的是:
尝试添加任意数字,而第一个(最左边)的数字是123(例如:添加12345和678)。您会看到结果始终为4,因为键盘输入的第一个字符是' 1'第三个是' 3'。
要输出数字> = 10,您必须使用" div"指令:" div cl"指令 - 例如 - 将ax中的16位(无符号)数字(eax的低16位)除以cl中的值(ecx的低8位)并将商(向下舍入)放入al(低) 8位eax),其余为ah(高16位的eax中的高8位)。