我的问题:当我打电话给printf时,为什么打印两次? 请注意,是的,我知道我在堆中为存储在堆栈中的变量分配空间。我只是习惯于在NASM中习惯malloc,指针和'数组'。
在x64位机器中编译:
nasm -f elf32 -o TEMP.o file.asm
和:
gcc -m32 -o exec TEMP.o
extern exit, printf, malloc, free
global main
section .data
format db "%s", 10
msg: db "Hello!!",10
BUF equ $-msg + 1
section .text
main:
push BUF ; How many bytes do we want to allocate
call malloc ; ptr stored in EAX
add esp, 4 ; clear the last thing on the stack (BUF)
mov esi, eax ; new source index at malloc pointer
xor ecx, ecx ; clear ECX (counter for us)
loop:
mov dl, [msg+ecx] ; mov letter into dl
mov BYTE [esi+ecx], dl ; cat dl onto array
inc ecx ; add 1 to our ounter
cmp ecx, BUF-1d
jl loop
xor edx, edx
mov BYTE [esi+ecx], dl
add esp, 4
mov esi, eax
push esi ;
push format
call printf
add esp, 4*2
push esi
call free
push 0
call exit
add esp, 4
答案 0 :(得分:1)
您只需要使用0
format db "%s", 10, 0
msg: db "Hello!!",10 ,0
好的,我刚看完评论,看到你说你有代码插入0
,我会检查一下,因为我复制/粘贴了你的代码,只添加了{ {1}}在字符串的两端使它输出一个字符串,我甚至没有注意到插入代码更不用说触摸它了,但我只能假设这是你的问题所在。