push eax 与 sub esp,0x4的问题
#include <windows.h>
int main()
{
__asm
{
push ebp
mov ebp,esp
xor eax,eax
//push eax
//push eax
//push eax
sub esp,0xc
mov byte ptr[ebp-0Ch],4Dh
mov byte ptr[ebp-0Bh],53h
mov byte ptr[ebp-0Ah],56h
mov byte ptr[ebp-09h],43h
mov byte ptr[ebp-08h],52h
mov byte ptr[ebp-07h],54h
mov byte ptr[ebp-06h],2Eh
mov byte ptr[ebp-05h],44h
mov byte ptr[ebp-04h],4Ch
mov byte ptr[ebp-03h],4Ch
lea eax,[ebp-0Ch]
push eax
mov edx,0x77E1850D //LoadLibrary sp3
call edx
//call ds:LoadLibraryA
//然后是开一个dos窗口:
push ebp
mov ebp, esp
sub esp, 0x2C
mov eax, 0x6D6D6F63
mov dword ptr [ebp-0x0C], eax
mov eax, 0x2E646E61
mov dword ptr [ebp-0x8], eax
mov eax, 0x226D6F63
mov dword ptr [ebp-0x4], eax
xor edx, edx
mov byte ptr [ebp-0x1], dl
lea eax, dword ptr [ebp-0xC]
push eax
mov eax, 0x77b88c10 //system sp3
call eax
}
return 0;
}
在这个里面有这么一段
push eax
push eax
push eax
mov byte ptr[ebp-0Ch],4Dh
mov byte ptr[ebp-0Bh],53h
mov byte ptr[ebp-0Ah],56h
mov byte ptr[ebp-09h],43h
mov byte ptr[ebp-08h],52h
mov byte ptr[ebp-07h],54h
mov byte ptr[ebp-06h],2Eh
mov byte ptr[ebp-05h],44h
mov byte ptr[ebp-04h],4Ch
mov byte ptr[ebp-03h],4Ch
如果修改成
sub esp,0xc
mov byte ptr[ebp-0Ch],4Dh
mov byte ptr[ebp-0Bh],53h
mov byte ptr[ebp-0Ah],56h
mov byte ptr[ebp-09h],43h
mov byte ptr[ebp-08h],52h
mov byte ptr[ebp-07h],54h
mov byte ptr[ebp-06h],2Eh
mov byte ptr[ebp-05h],44h
mov byte ptr[ebp-04h],4Ch
mov byte ptr[ebp-03h],4Ch
就会报一个内存不能read的错误。[我的机器是windows 2003 sp2]
push eax相当于esp-4应该没错吧,为什么就不行了呢?这同样都是在堆栈里开了12个字节的空间啊……
相关推荐
从汇编到c 调用约定 堆栈原理
学习汇编的一个重要的方法就是将汇编代码和c代码之间进行转换练习,这样的练习做的越多,对汇编就越熟悉,同时对c代码的理解也更加深刻。很多时候,拿到一个程序的反汇编代码,虽然可能每一行汇编代码都知道什么意思,但却发现对于整个程序干了什么却不知道,原因在于一个简单的程序,翻译成汇编的代码量相对于c程序而言多了好多,而且因为汇编代码和人的思维差别比较大,所以,对于整个逻辑的理解就很困难。然而如果经常做一些将汇编翻译成c代码的练习,那么你渐渐就会发现,汇编代码其实也很都有规律,看到这一段汇编代码,你就很自然的联想到它对应的c代码。 下面我们就开始做一下这样的练习,首先看一下下面的汇编代码: ##### 第一段第代码 00401020 push ebp ; 保存epb 00401021 mov ebp,esp ; 将ebp指向栈顶 00401023 sub esp,4Ch ;为局部变量分配空间,sub esp, xxx相当于多个push 00401026 push ebx ; 保存ebx 00401027 push esi ; 保存esi 00401028 push edi ; 保存edi, 上面3个寄存器在使用之前必须保存 00401029 lea edi,[ebp-4Ch] ; 将刚刚分配的局部空间的地址送到edi 0040102C mov ecx,13h ; ecx这里是循环次数=4ch/4h =13h 00401031 mov eax,0CCCCCCCCh ; 将4个int 3指令放入eax 00401036 rep stos dword ptr [edi] ; 将分配的局部变量空间都用int 3指令填充 .....
部分汇编指令说明--部分指令有实例
部分汇编指令说明--部分指令有实例 如果各位谁想下载请来吧!
DSP C6000系列 常用汇编指令大全
该文档里面列出了针对于DSP C6000系列芯片的全部汇编指令,可以供大家在编写汇编时进行参考,特别在CCS中编C与汇编混合编程时,很有用。
PC汇编语言PC Assembly Language
一本涵盖32位保护模式汇编程序设计的教科书。
汇编语言根据分数分级
将学生的分数分成A B C D等级用汇编语言实现


