程序集printf - 仅打印字符串的第一个字符

时间:2011-12-16 18:30:57

标签: string assembly printf

我正在尝试通过调用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

然而,当我运行它时,它只打印第一个字符 - '“',而不是整个字(”你好“)。

非常感谢

1 个答案:

答案 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,可能有更好的方法将字节加载到间接地址中,但是我没有比我可以计算更多年来查看汇编。