【问题标题】:Assembly Language Using Nasm使用 Nasm 的汇编语言
【发布时间】:2014-10-03 18:21:31
【问题描述】:

我是汇编语言的新手。 我正在尝试使用此代码添加两个数字;这些值是硬编码的。 我正在使用“nasm”,并且正在成功构建可执行文件。 当我运行它时,它没有输出。 我开始知道,如果该值是一个整数,例如在这种情况下是两个数字的总和,我们需要将其转换为字符串以使用 sys_write 写入它。 如果这是唯一需要照顾的事情,我应该怎么做?如果没有,为什么即使我可以使用 gdb 在寄存器中看到输出,我也无法在 stdout 上看到输出?

global _start
section .text
_start:

mov eax,0x3
mov ebx,0x5
add eax,ebx
mov ecx,eax
mov eax,0x4
mov ebx,0x1
mov edx,0x1
int 0x80

mov eax,0x1
mov ebx,0x0
int 0x80

segment .data
sum db 0x00

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    您正在调用write 系统调用,如下所示:

    ssize_t write(int fd, const void *buf, size_t count);
    

    您传递的是结果数字,而不是指向包含您要打印的内容的缓冲区的指针。那是行不通的。此外,您的号码是二进制的,而不是文本。作为单个数字的快速修复,您可以添加 0 的 ascii 代码,并将生成的字符放入内存中进行打印。您可以为此使用堆栈。

    global _start
    section .text
    _start:
    
    mov eax,0x3
    mov ebx,0x5
    add eax,ebx
    add al, '0'  ; convert to text
    push eax     ; store on stack
    mov ecx,esp  ; pass its address for printing
    mov eax,0x4
    mov ebx,0x1
    mov edx,0x1
    int 0x80
    add esp, 4   ; free stack space
    
    mov eax,0x1
    mov ebx,0x0
    int 0x80
    
    segment .data
    sum db 0x00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多