我是NASM的新手。我想在stdin和第二个硬编码中添加两个数字,然后在屏幕上打印结果。但我得到的结果是问号( )。这是代码:
section .bss
buf: resb 1
res: resb 1
section .text
global _start
_read:
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, buf ; buffer
mov edx, 1 ; read byte count
int 80h
_adding:
add ecx, 10
sub ecx, '0'
mov [res], ecx
_write:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, res ; buffer
mov edx, 1 ; write byte count
int 80h
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
我尝试过样本节目,像这样添加:
_adding:
sub ecx, '0'
mov eax, '1' ; put 1
sub eax, '0'
add eax, ecx ; adding 1+'user input'
add eax, '0'
mov [res], eax
但是我得到了输出。 如有任何帮助,谢谢。
答案 0 :(得分:1)
以下是您的代码的工作示例。它仅适用于,当结果为< 10时,结果只有1位数。
section .bss
buf: resb 1
res: resb 1
section .text
global _start
_start: ; you made the label _start global,
; but you forgot to add the label.
_read:
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, buf ; buffer (memory address, where read should save 1 byte)
mov edx, 1 ; read byte count
int 80h
_adding:
mov cl, [buf] ; copy 1 byte (the ASCII-char) from address buf into cl
sub cl, '0' ; same as "sub cl, 30h"; changes ASCII number into binary number. (This is optional)
add cl, 1 ; it will not work, when the result is >9!
; Because then you get 2 digits
add cl, '0' ; convert binary number back to ascii-char.
; (This is optional)
mov [res], cl ; you could use buf instead of res, too.
_write:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, res ; buffer
mov edx, 1 ; write byte count
int 80h
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
答案 1 :(得分:0)
您似乎正在从终端读取ASCII(1个字符),然后在该字符中添加10并减去&#39; 0&#39; (的0x30)。你进入了什么角色?如果您输入一个数字(&#39; 0&#39;到&#39; 9&#39;这是0x30到0x39),结果将是0x0A到0x13的ASCII代码,这是不可打印的控制字符。< / p>
尝试将add acx,10
更改为add acx,1
并删除包含sub ecx,'0'
的行。如果输入&#39; 0&#39;,您应该得到&#39; 1&#39;。
如果这不起作用,那么您的IO中还有其他错误。我对int 80h
没有足够的了解来帮助解决这个问题。
答案 2 :(得分:0)
您甚至忘记使用您阅读的值。它当然在[buf]
。此外,它是byte
而不是dword
(尽管后者在这种情况下意外发生)。此外,您尝试的简单方法仅适用于单位数字,因此添加10已经注定失败。此外,您可以通过减去'0'
来调整输入,但不要将其添加回输出(就像在底部的示例中完成的那样)。