在汇编代码 lods 和 stos 中转换指令,以便 NASM 可以编译

Chr*_*Man 3 assembly nasm

好的,所以我正在尝试使用nasm -f elf final.asm以下方法在汇编中组装一些代码:

xor eax,eax
push eax
push dword(0x75792273)
push dword(0x70742027)
push dword(0x77777875)
push dword(0x20237678)
push dword(0x76727827)
push dword(0x27797175)
push dword(0x75711225)
push dword(0x72747676)
push dword(0x74231476)
push dword(0x70707470)
push dword(0x23247077)
push dword(0x78707822)
push dword(0x24711174)
push dword(0x22707373)
push dword(0x78717974)
push dword(0x75771777)
push dword(0x70777125)
push dword(0x73731472)
push dword(0x71277377)
push dword(0x79251822)
push dword(0x79707478)
push dword(0x78742779)
push dword(0x72727871)
push dword(0x71251475)
push dword(0x27247772)
push dword(0x79757479)
push dword(0x70227071)
push dword(0x77737420)
push dword(0x70251970)
push dword(0x74747127)
push dword(0x23277677)
push dword(0x79712024)
push esp
pop esi
mov edi,esi
mov edx,edi
cld
mov ecx,0x80
mov ebx,0x41
xor eax,eax
push eax
lods byte[esi]
xor eax,ebx
stos byte[es:edi]
loop 0xb7
push esp
pop esi
int 0x3
Run Code Online (Sandbox Code Playgroud)

这导致以下错误:

final.asm:44: error: parser: instruction expected
final.asm:46: error: parser: instruction expected
Run Code Online (Sandbox Code Playgroud)

我在以下位置找到了这些错误的答案: NASM: parser: instructions expected rep movs

基本上,这表示 lods 和 stos 指令不被 NASM 识别。这意味着我需要将它们转换为 NASM 识别的内容,以便获得相同的结果。

我的问题是,我可以将这两行更改为什么,以便 NASM 可以编译它,以便我最终可以调试它。

Tom*_*e2k 5

什么lodsb是:

mov al,[esi]
inc esi           ; (or dec, according to direction flag)
Run Code Online (Sandbox Code Playgroud)

你也可以使用
lodsw(以加载的话ax,增加esi了2),或
lodsd以负载双字(到eax,增加esi由4)。

并且stosb确实

mov [es:edi],al
inc edi
Run Code Online (Sandbox Code Playgroud)

同样在这里,stoswstosd将存储2个或4字节(以及调整edi相应)

首先从 SOURCE (ESI) 寄存器指向的内存加载,然后写入 DESTINATION (ES:EDI) 寄存器指向的内存。

您不需要(也不能)指定将使用哪些寄存器。来源永远是 E S I,目的地永远是 E D I


段寄存器编辑:该lods指令可以与段覆盖前缀(即ss lodsb)一起使用。该stos指令固定为es(原始答案中缺少详细信息)段用法,并且不能被覆盖。

movsb/movsw/movsd指令(size*(mov [es:edi],[ds:esi] inc esi inc edi))也可以覆盖在源极侧,即。es movsb将从而es:esi不是 中获取字节ds:esi,但目标段寄存器固定为es