Assembly 32位组件-正确使用lodsb
我试图在32位汇编中编写一个函数,该函数接受一个字符串,并使用LODSB指令逐字符打印它 我做错了一些事情,因为我总是会遇到分割错误,但实际上我不明白我犯了什么错误,我只知道这是在使用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
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。