在程序集中增加操作

时间:2014-06-30 08:06:28

标签: assembly nasm

我有以下汇编代码:

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 

我只是尝试增加一个数字并打印出来。这成功编译,但不会打印任何屏幕。我在这里缺少什么?

1 个答案:

答案 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