NASM - 添加两个数字(一个来自stdin,另一个来自硬编码)

时间:2015-01-16 00:50:58

标签: assembly x86 stdout nasm

我是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

但是我得到了输出。 如有任何帮助,谢谢。

3 个答案:

答案 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'来调整输入,但不要将其添加回输出(就像在底部的示例中完成的那样)。