我在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
答案 0 :(得分:0)
我立即看到的一件事是,您要将要打印的值(48,49,[数字])直接移动到ecx中。 SYS_WRITE期望ecx包含文本字符串的POINTER,而不是直接包含值。
其次,您应该考虑使用您期望的值手动填充字符串(实际上,所有输入),这样您就可以确定问题不在于阅读等。只是省略了被调用的代码让你得到一个最小的错误情况,它只是假设大多数时间都是正确的。