我想用linux系统调用编写一个非常简单的宏:
%macro hello_macro 1
section .rodata
%%string1: dd "hello: ",0
section .bss
%%string2: resd 1
section .text
;global %%_start1
%%_start1:
mov dword[%%string1],%1 ;mov argument to string
;system call write in stdout
mov eax,4
mov ebx,1
mov ecx,dword[%%string1]
mov edx,6
int 80h
;same
mov eax,4
mov ebx,1
mov ecx,dword[%%string2]
mov edx,4 ;it's 4 bytes so I assume it's 4 chars length.
int 80h
%endmacro
我这样称呼(在.text中):
hello_macro 0x00613233
问题在于它没有做任何事情(甚至是错误)!
我这样编译(没有makefile):
nasm -f elf -o 2.o 2.s
gcc -o 2 2.o
2.c是文件。 TNX!
答案 0 :(得分:1)
我不知道为什么你没有收到任何错误,因为你在这一行上引用了一个未定义的变量:
mov dword[%%string],%1 ;mov argument to string
假设应该是%%string2
。
mov dword[%%string2],%1 ;mov argument to string
我能看到的另一个问题是ecx应该设置为你想要写的字符串的地址。像这样:
mov ecx,%%string1
在当前代码中,您将ecx设置为该字符串的前四个字节。