如何解决汇编中的变量到底是什么?
我是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,[ebp-4]
push eax
push 4
push "1234"
push ebx
call _WriteFile@20
mov esp,ebp
ret
它什么也不输出
为什么?消息中没有“ 1234”的信息是什么?推送消息时,程序是否仅推送存储“ 1234”的内存的地址?如果是这样,我可以将“ 1234”存储在其他地方,而不是在不创建变量的情况下推送其地址吗?
解决方法
变量是一个逻辑结构-变量的生命周期有些短,有些长。它们可以形成并消失。
相比之下,寄存器和内存是物理结构—从某种意义上说,它们始终在那儿。
在汇编编程中,由人类或由编译器生成,我们将C代码,算法和伪代码所需的逻辑变量映射到处理器中可用的物理存储。当变量的生命周期结束时,我们可以重复使用它用于其他目的的物理存储(另一个变量)。
汇编语言支持全局变量(完整的进程生命周期)和局部变量-可以位于堆栈的内存中,也可以位于CPU寄存器中。当然,CPU寄存器没有地址,因此不能通过(内存)引用传递。 CPU寄存器也无法索引,因此要索引数组需要内存。
,我会在堆栈上创建一个局部变量,像这样:
print:
; DWORD bytes;
mov ebp,esp
sub esp,12
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx,eax
lea ecx,[ebp-12]
mov dword ptr [ecx],“1234”
; WriteFile( hstdOut,message,length(message),&bytes,0);
push 0
lea eax,[ebp-4]
push eax
push 4
push ecx
push ebx
call _WriteFile@20
mov esp,ebp
ret
注意:语法mov ...,“1234”
可能会或可能不会满足您的要求,具体取决于汇编程序。我不记得Microsoft汇编程序如何处理它。如果它不能转换为0x34333231,请改用该常量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。