我有以下汇编代码:
segment .data
sayi db 1
segment .text
global _start
_start:
mov ecx, sayi
inc ecx
mov [sayi], ecx
mov eax, 4 ;system call number for output(sys_write)
mov ebx, 1 ;default output device
mov ecx, sayi ;message to write
mov edx, 4 ;message length
int 0x80 ;call kernel
mov eax,1 ;The system call for exit (sys_exit)
mov ebx,0 ;Exit with return code of 0 (no error)
int 0x80 ;call kernel
我只是尝试增加一个数字并打印出来。这成功编译,但不会打印任何屏幕。我在这里缺少什么?
答案 0 :(得分:0)
您的代码存在一些问题:
mov ecx, sayi
inc ecx
mov [sayi], ecx
第一行会将sayi
的地址复制到ecx
,而不是sayi
的值。要获得值,您需要编写mov ecx,[sayi]
。
另一个问题是你只在sayi
保留了一个字节的空格
,但你试图访问它,好像它是dword
(4个字节)。要预订dword
,您应使用dd
代替db
。
然后是您的打印问题。 sys_write
系统调用将任何ecx
点作为一系列字符打印出来。它不会执行从整数到字符串的任何转换,因此您必须自己完成这些操作。
以下是我为之前的问题编写的做这种转换的NASM实现示例:
; Input:
; EAX = integer value to convert
; ESI = pointer to buffer to store the string in (must have room for at least 10 bytes)
; Output:
; EAX = pointer to the first character of the generated string
int_to_string:
add esi,9
mov byte [esi],0
mov ebx,10
.next_digit:
xor edx,edx ; Clear edx prior to dividing edx:eax by ebx
div ebx ; eax /= 10
add dl,'0' ; Convert the remainder to ASCII
dec esi ; store characters in reverse order
mov [esi],dl
test eax,eax
jnz .next_digit ; Repeat until eax==0
mov eax,esi
ret
或者,只需将'0'
添加到数字中,即可将0..9范围内的数字转换为数字,然后通过将数字地址放在{{sys_write
中来打印。 1}}和ecx
中的1
。