我正在集会上表达。现在我有一个简单的while循环,以eax = 1开头,然后循环直到eax = 10.在循环中我使用打印宏来打印te进度(应该打印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宏来打印值?我需要改变什么呢?
由于
答案 0 :(得分:3)
好的,有几件事:
1)您正在调用的系统调用写入一个ascii字符串,因此您必须将整数转换为ascii。从0到9你必须为整数添加30h(如果我记得很清楚)以获得相应的ascii代码,但是对于更大的数字,它会变得越来越复杂。
2)传递给sys_write(1)的大小是错误的,你应该传递3(2个字节来保存数字+一个终止空字节)。
由于您必须更改所有寄存器的值才能调用sys_write,我建议您使用esi或edi来保持计数器或推送,然后在写入时弹出它。