打印出两次NASM

时间:2014-01-24 22:46:27

标签: c assembly printf nasm

我的问题:当我打电话给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

1 个答案:

答案 0 :(得分:1)

您只需要使用0

结束字符串
format  db  "%s", 10, 0
msg:    db "Hello!!",10 ,0

好的,我刚看完评论,看到你说你有代码插入0,我会检查一下,因为我复制/粘贴了你的代码,只添加了{ {1}}在字符串的两端使它输出一个字符串,我甚至没有注意到插入代码更不用说触摸它了,但我只能假设这是你的问题所在。