Assembly 32位组件-正确使用lodsb

Assembly 32位组件-正确使用lodsb,assembly,Assembly,我试图在32位汇编中编写一个函数,该函数接受一个字符串,并使用LODSB指令逐字符打印它 我做错了一些事情,因为我总是会遇到分割错误,但实际上我不明白我犯了什么错误,我只知道这是在使用LODSB 这是我的密码: CPU X64 extern printf,putchar global main SECTION .data str1 DB 10h,0Dh,'Stampata in un solo colpo',10,0 str2 DD 10h,0Dh,'Stam

我试图在32位汇编中编写一个函数,该函数接受一个字符串,并使用LODSB指令逐字符打印它

我做错了一些事情,因为我总是会遇到分割错误,但实际上我不明白我犯了什么错误,我只知道这是在使用LODSB

这是我的密码:

CPU X64

extern printf,putchar
global main

SECTION .data
    str1    DB  10h,0Dh,'Stampata in un solo colpo',10,0
    str2    DD  10h,0Dh,'Stampata byte per byte',10,0
    fine    DB  10h,0Dh,'Programma terminato',10,0

SECTION .text
main:   
    PUSH    str1
    CALL    printf
    POP EAX

    MOV ESI,str2     ;changed the register
    CLD         ;direction flag=0

stampa: LODSB
    CMP AX,0        ;at the end of string jump to end
    JE  end
    PUSH    AX
    CALL    putchar
    JMP     stampa

end:    PUSH    fine
    CALL    printf
    POP     EAX
现在输出如下:

Stampata in un solo colpo
Programma terminato
Errore di segmentazione (core dump creato)

看看printf的原型。我已经读过printf,我试图学习LODSB指令的使用,事实上我想一个字符一个字符地打印第一个字符串,在一个块中打印第二个最后的字符串。如果我直接跳到最后一个字符串,我不会得到错误。LODSB不是从EDI加载的,它是从ESI加载的,这很有意义,它是从源索引加载的,而不是从目标索引加载的。调用putchar后,您不会恢复堆栈指针。LODSB将一个字节加载到al中,但您将ax与0进行比较。您应该正在执行cmp al,0。或者更好,因为要为putchar推一个整数,所以每次调用lodsb之前都要清除ax或eax。