在添加这两个数字时,我已尽力解释我的所有思考过程。但是,在运行生成的可执行文件时,我最终会使用 “总和是:j”这显然是错误的。此外,似乎无论我给哪些输入总和都保持为“j”,所以必定存在一些非常错误。
我相信这段代码应该有效,但我的理解显然有缺陷 我应该从哪里开始解决这个问题?我刚刚开始学习装配。
section .data ;line 1
msg db "Sum is: "
len equ $ - msg
section .bss
num1 resb 1
eol1 resb 1
num2 resb 1
eol2 resb 1
sum resb 2
section .text
global _start
print_int:
mov eax, 4 ;defining routine print_int
mov ebx, 1 ;file descriptor (stdout)
int 0x80 ;system call number (sys_write)
ret ;return back
_start:
;Read and store user input for num1
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2 ;2 bytes of info
int 80h
mov byte [eol1], 0xA ; value of first end of line
;Read and store user input for num2
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2 ;2 bytes of info
int 80h
mov byte [eol2], 0xA ;value of 2nd end of line
;Add num1 and num2
mov eax, num1
sub eax, '0' ;this is so that the value in 3 is set to 3 because
;'3' and '0' actually are ASCII values
mov ebx, num2
sub ebx, '0'
add eax, ebx ;Move the sum of 0x3 and 0x4 into eax
add eax, '0' ;Set eax to be the ASCII value for the result of the sum
mov [sum], eax ;Set this ascii value of the sum to sum
mov ecx, msg ;Move msg ('Sum is: ') into eax
mov edx, len ;Move len (length of msh) into edx
call print_int ; call routine print_int above
;load sum to to be printed
mov ecx, sum
mov edx, 2 ;size in bytes of sum
call print_int
mov eax, 1 ;system call number (sys_exit)
xor ebx, ebx
int 0x80 ;line 43
答案 0 :(得分:0)
您的程序使用用户输入的2个单位数字进行操作。
mov eax, num1 mov ebx, num2
在NASM上,这将在这些寄存器中移动这些变量的地址。你想要的是内容!你需要写方括号
但是等等 - 因为输入只有一个字节的信息,你应该读取字节大小的寄存器AL
和BL
中的数据。
mov al, [num1]
mov bl, [num2]
然后,所有减法和添加也必须使用这些较小的尺寸。
sub al, '0' ;From character '0'-'9' to number 0-9
sub bl, '0'
add al, bl
add al, '0' ;From number 0-9 to character '0'-'9'
AL
中的字符是您要打印的字符。最简单的方法是首先在AH
寄存器中附加换行符0xA,然后在内存中写入AX
。
mov ah, 0xA
mov [sum], ax
只要2个单位数字的总和小于10,所有上述内容都是正确的 想象一下,当您输入例如数字5和8?
总和(13)需要2个字符,不能留出额外的换行符。最大的金额将来自增加9和9(18)
最好重新定义"总和"为sum resb 3
。
然后写下以下内容:
mov al, [num1]
mov bl, [num2]
sub al, '0'
sub bl, '0'
add al, bl
mov edx, 2 ;String length if single digit sum
mov ecx, sum ;Address of sum
cmp al, 10
jb SingleDigit
mov byte [ecx], '1'
inc ecx ;Move to position for the units/newline
inc edx ;String length if double digit sum
sub al, 10 ;Only keep the units
SingleDigit:
add al, '0' ;From number 0-9 to character '0'-'9'
mov ah, 0xA ;Append newline
mov [ecx], ax
mov ecx, sum
call print_int