我正在尝试通过调用printf来打印程序集中的字符串。
我的汇编代码:
mov dword[ebx + 0], '"'
mov dword[ebx + 4], 'h'
mov dword[ebx + 8], 'e'
mov dword[ebx + 12], 'l'
mov dword[ebx + 16], 'l'
mov dword[ebx + 20], 'o'
mov dword[ebx + 24], '"'
mov dword[ebx + 28], 0
push ebx
push formatString
call printf
add esp, 8
...
formatString db '%s', 10, 0
然而,当我运行它时,它只打印第一个字符 - '“',而不是整个字(”你好“)。
非常感谢
答案 0 :(得分:5)
我的程序集生锈了,但那些应该是按字节顺序移动的。你需要一个内存中的字节数组,因为这是printf
所期望的%s
。内存中的字符串可能是"\0\0\0h\0\0\0e\0\0\0l\0\0\0l\0\0\0o\0\0\0"\0\0\0\0\0\0\0
。
mov dword[ebx + 0], '"' ; moves the 32-bit value 0x22000000 to EBX
mov dword[ebx + 4], 'h' ; moves the 32-bit value 0x68000000 to EBX + 4
...
所以,如果ebx
包含地址0x123456,那么你在内存中会有如下内容:
0123456 | 22 00 00 00 68 00 00 00 65 00 00 00 6c 00 00 00 | "...h...e...l... |
0123466 | 6c 00 00 00 6f 00 00 00 22 00 00 00 00 00 00 00 | l...o..."....... |
即使您将0x123456作为地址传递给printf
,它只能在遇到第一个NUL字节之前看到一个字符。以下应该有效:
mov dword[ebx + 0], 577267052 ; 0x2268656c = "hel
mov dword[ebx + 4], 1819222528 ; 0x6c6f2200 = lo"\0
push ebx
push formatString
call printf
add esp, 8
基于ebx
,可能有更好的方法将字节加载到间接地址中,但是我没有比我可以计算更多年来查看汇编。