我是一名使用高级语言的开发人员,在业余时间学习汇编语言。请参阅下面的NASM程序:

section .data

section .bss

section .text
global main
main:
    mov eax,21
    mov ebx,9
    add eax,ebx
    mov ecx,eax
    mov eax,4
    mov ebx,1
    mov edx,4
    int 0x80
push ebp
mov ebp,esp

mov esp,ebp
pop ebp
ret


这是我使用的命令:

ian @ ubuntu:〜/ Desktop / NASM / Program4 $ nasm -f elf -o asm.o SystemCalls.asm
ian @ ubuntu:〜/ Desktop / NASM / Program4 $ gcc -o程序asm.o
ian @ ubuntu:〜/ Desktop / NASM / Program4 $ ./程序

我没有任何错误,但是没有任何内容打印到终端上。我使用以下链接来确保寄存器包含正确的值:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

最佳答案

您必须将整数值转换为字符串才能使用sys_write(系统调用4)将其打印出来。可以这样进行转换(未经测试):

; Converts the integer value in EAX to a string in
; decimal representation.
; Returns a pointer to the resulting string in EAX.
int_to_string:
  mov byte [buffer+9],0  ; add a string terminator at the end of the buffer
  lea esi,[buffer+9]
  mov ebx,10             ; divisor
int_to_string_loop:
  xor edx,edx            ; clear edx prior to dividing edx:eax by ebx
  div ebx                ; EAX /= 10
  add dl,'0'             ; take the remainder of the division and convert it from 0..9 -> '0'..'9'
  dec esi                ; store it in the buffer
  mov [esi],dl
  test eax,eax
  jnz int_to_string_loop    ; repeat until EAX==0
  mov eax,esi
  ret

buffer: resb 10

关于linux - NASM添加程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18834760/

10-13 09:07