【发布时间】:2020-09-07 19:17:01
【问题描述】:
我是 x86 汇编的新手,最近一直在使用 nasm 进行一些实验,并在 Windows 10 机器上运行该程序。
我有这个代码:
global _start
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .data
message db "1234"
section .text
_start:
call print
call _ExitProcess@4
print:
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp-4]
push eax
push 4
push message
push ebx
call _WriteFile@20
mov esp, ebp
ret
; ExitProcess(0)
我使用以下命令组装它:
nasm -f win32 out.asm
link out.obj /entry:start /subsystem:console "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x86\kernel32.lib"
在 cmd 上运行时,它会按预期输出“1234”
现在在组装和运行以下代码时,程序直接推送“1234”而不是推送消息
global _start
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .data
message db "1234"
section .text
_start:
call print
call _ExitProcess@4
print:
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp-4]
push eax
push 4
push "1234"
push ebx
call _WriteFile@20
mov esp, ebp
ret
什么都不输出
为什么? message 有哪些“1234”没有的信息?推送消息时,程序是否只是推送存储“1234”的内存地址?如果是这样,我可以将“1234”存储在其他地方,而不是在不创建变量的情况下推送其地址吗?
【问题讨论】:
-
是的,你需要传递地址。是的,您可以将其存放在任何您喜欢的地方。至于你是否认为变量并不重要。
-
在汇编中考虑变量的另一种方式是它们只是特定内存地址的标签。 (例如,
message db "1234"、message是"1234"的起始字节所在的地址)当您想要存储在该地址的内容时,您可以通过将变量括在[...]中来取消引用该变量,例如[message]. -
好的,尝试在“push o”行之前推“1234”,而不是将 esp 移动到 edi,然后推 edi,而不是“1234”,它似乎正在工作
标签: windows assembly windows-10 nasm