装配程序缺少输出

时间:2016-10-13 16:15:26

标签: assembly x86 nasm

我在Linux VM上使用x86汇编代码,intel格式和NASM。 该程序应该采用空格分隔两位数字并打印出总和。我用GDB看了它,它在整个过程中一直很好,没有错误或任何东西,除了它无声地拒绝打印结果。我是汇编代码的新手,所以我真的不知道我在这里做错了什么。

编辑:缩短代码以仅包含更相关的位。我想。

;Variables
section .bss
    digit       resb 1           

_start:
    ;Input Prompt
        ;Code block edited out.

    ;Reads 1st digit input, checks if the read operation was successfull,
    ;and stores the value in EAX.
    call _readDigit
    cmp edx,0
    jne _end
    mov eax,ecx

    ;Reads 2nd digit input, checks for read success,
    ;and stores the value in EBX.
    call _readDigit
    cmp edx,0
    jne _end
    mov ebx,ecx

    ;Sums EAX and EBX, stores result in ECX,
    ;and calls the write procedure.
    call _newLine
    add eax,ebx
    mov ecx,eax
    call _writeSum    

;Prints out the sum of two digits in the format 0X for values
;below 10, or 1X for values greater than 9.
_writeSum:
    push eax
    push ebx
    push ecx
    push edx

    mov [digit],ecx
    cmp ecx,9       ;Checks if sum > 9.
    jg _twoDigits

;Prints out 0 for the first digit in the result.
_oneDigit:
    mov ecx,48
    mov edx,1
    mov ebx,STDOUT
    mov eax,SYS_WRITE
    int 80h

    mov ecx,[digit]
    jmp _lastDigit

;Prints out 1 for the first digit in the result,
;and subtracts 10 from ECX.
_twoDigits:
    mov ecx,49
    mov edx,1
    mov ebx,STDOUT
    mov eax,SYS_WRITE
    int 80h

    mov ecx,[digit]
    sub ecx,10

;Converts ECX to ASCII and prints this as the
;second digit in the result.
_lastDigit:
    add ecx,'0'
    mov [digit],ecx

    mov ecx,[digit]
    mov edx,1
    mov ebx,STDOUT
    mov eax,SYS_WRITE
    int 80h

    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

1 个答案:

答案 0 :(得分:0)

我立即看到的一件事是,您要将要打印的值(48,49,[数字])直接移动到ecx中。 SYS_WRITE期望ecx包含文本字符串的POINTER,而不是直接包含值。

其次,您应该考虑使用您期望的值手动填充字符串(实际上,所有输入),这样您就可以确定问题不在于阅读等。只是省略了被调用的代码让你得到一个最小的错误情况,它只是假设大多数时间都是正确的。