【问题标题】:How to print integers in assembly loop [duplicate]如何在汇编循环中打印整数[重复]
【发布时间】:2011-02-04 16:59:46
【问题描述】:

我正在尝试组装。现在我有一个简单的 while 循环,从 eax = 1 开始,然后循环直到 eax = 10。在循环中,我使用打印宏来打印进度(应该打印 1 - 10),但它不起作用..

section .bss
    buffer resd 1

section .text
    global _start


%macro write 3
    mov eax, 4
    mov ebx, %1
    mov ecx, %2
    mov edx, %3
    int 80H
%endmacro

_start:
    xor eax, eax
    inc eax

while:
    cmp eax, 10
    jg end

    mov [buffer], eax

    write 1, [buffer], 1

    mov eax, [buffer]       

    inc eax
    jmp while

end:
    mov eax, 1
    xor ebx, ebx
    int 0x80

c 的等价物是:

#include <stdio.h>

int main(void)
{
    unsigned int i = 1;
    while(i <= 10)
    {
        printf("%d", i);
        i++;
    }

    return 0;
}

所以我的问题是.. 我如何使用 write 宏来打印值?我有什么需要改变的?

谢谢

【问题讨论】:

  • 如果您使用汇编语言工作,则需要学习以十六进制阅读和思考。您当然可以编写转换为十进制的代码,并且会为用户指定的输出执行此操作,但是在监视代码时,它是二进制的简写,而十六进制是一个近乎理想的简写。

标签: linux assembly printing integer nasm


【解决方案1】:

好的,有几件事:

1) 您正在调用的系统调用写入一个 ascii 字符串,因此您必须从整数转换为 ascii。从 0 到 9 你必须将 30h 添加到整数(如果我没记错的话)以获得相应的 ascii 代码,但对于更大的数字,它变得越来越复杂。

2) 你传递给 sys_write (1) 的大小是错误的,你应该传递 3(2 个字节来保存数字 + 一个终止空字节)。

而且由于您必须更改所有寄存器的值才能调用 sys_write 我建议您使用 esi 或 edi 来保持计数器或推送,然后在写入时弹出它。

【讨论】:

  • okeeee 谢谢你!它解决了我的问题。
猜你喜欢
  • 2011-10-17
  • 2015-09-16
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多