三九宝宝网宝宝教育教学论文

汇编中sub esp 1是什么意思!

05月14日 编辑 39baobao.com

[汇编语言中清除屏幕语句是什么]单独的清屏指令没有。高级语言中实现比较简单,有专门的清屏指令。 只能写子程序或者宏。 给你一个参考的: CLEAR MACRO push dx push cx push bx push ax mov ah,6 mov al,0 m...+阅读

sub esp,1 在堆栈中留出局部变量的空间 看看下面的文章对你的汇编语言一定有帮助! 汇编中参数的传递和堆栈修正 在 Win32汇编中,我们经常要和 Api 打交道,另外也会常常使用自己编制的类似于 Api 的带参数的子程序,本文要讲述的是在子程序调用的过程中进行参数传递的概念和分析。一般在程序中,参数的传递是通过堆栈进行的,也就是说,调用者把要传递给子程序(或者被调用者)的参数压入堆栈,子程序在堆栈取出相应的值再使用,比如说,如果你要调用 SubRouting(Var1,Var2,Var3),编译后的最终代码可能是 push Var3 push Var2 push Var1 call SubRouting add esp,12 也就是说,调用者首先把参数压入堆栈,然后调用子程序,在完成后,由于堆栈中先前压入的数不再有用,调用者或者被调用者必须有一方把堆栈指针修正到调用前的状态。

参数是最右边的先入堆栈还是最左边的先入堆栈、还有由调用者还是被调用者来修正堆栈都必须有个约定,不然就会产生不正确的结果,这就是我在前面使用“可能”这两个字的原因:各种语言中调用子程序的约定是不同的,它们的不同点见下表: C SysCall StdCall Basic Fortran Pascal 参数从左到右 是 是 是 参数从右到左 是 是 是 调用者清除堆栈 是 允许使用:VARARG 是 是 是 VARARG 表示参数的个数可以是不确定的,有一个例子就是 C 中的 printf 语句,在上表中,StdCall 的定义有个要说明的地方,就是如果 StdCall 使用 :VARARG 时,是由调用者清除堆栈的,而在没有:VARARG时是由被调用者清除堆栈的。 在 Win32 汇编中,约定使用 StdCall 方式,所以我们要在程序开始的时候使用 .model stdcall 语句。

也就是说,在 API 或子程序中,最右边的参数先入堆栈,然后子程序在返回的时候负责校正堆栈,举例说明,如果我们要调用 MessageBox 这个 API,因为它的定义是 MessageBox(hWnd,lpText,lpCaption,UType) 所以在程序中要这样使用: push MB_OK push offset szCaption push offset szText push hWnd call MessageBox ... 我们不必在 API 返回的时候加上一句 add sp,4*4 来修正堆栈,因为这已经由 MessageBox 这个子程序做了。在 Windows API 中,唯一一个特殊的 API 是 wsprintf,这个 API 是 C 约定的,它的定义是 wsprintf(lpOut,lpFormat,Var1,Var2...),所以在使用时就要: push 1111 push 2222 push 3333 push offset szFormat push offset szOut call wsprintf add esp,4*5 下面要讲的是子程序如何存取参数,因为缺省对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据右图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2。

另外,局部变量也是定义在堆栈中的,它们的位置一般放在 push ebp 保存的 EBP 数值的后面,局部变量1、2对应的地址分别是 [ebp-4]、[ebp-8],下面是一个典型的子程序,可以完成第一个参数减去第二个参数,它的定义是: MyProc proto Var1,Var2 ;有两个参数 local lVar1,lVar2 ;有两个局部变量 注意,这里的两个 local 变量实际上没有被用到,只是为了演示用,具体实现的代码是: MyProc proc push ebp mov ebp,esp sub esp,8 mov eax,dword ptr [ebp + 8] sub eax,dword ptr [ebp + c] add esp,8 pop ebp ret 8 MyProc endp 现在对这个子程序分析一下,push ebp/mov ebp,esp 是例行的保存和设置 EBP 的代码,sub esp,8 在堆栈中留出两个局部变量的空间,mov /add 语句完成相加,add esp,8 修正两个局部变量使用的堆栈,ret 8 修正两个参数使用的堆栈,相当于 ret / add esp,8 两句代码的效果。

可以看出,这是一个标准的 Stdcall 约定的子程序,使用时最后一个参数先入堆栈,返回时由子程序进行堆栈修正。当然,这个子程序为了演示执行过程,使用了手工保存 ebp 并设置局部变量的方法,实际上,386 处理器有两条专用的指令是完成这个功能用的,那就是 Enter 和 Leave,Enter 语句的作用就是 push ebp/mov ebp,esp/sub esp,xxx,这个 xxx 就是 Enter 的,Leave 则完成 add esp,xxx/pop ebp 的功能,所以上面的程序可以改成: MyPorc proc enter 8,0 mov eax,dword ptr [ebp + 8] sub eax,dword ptr [ebp + c] leave ret 8 MyProc endp 好了,说到这儿,参数传递的原理也应该将清楚了,还要最后说的是,在使用 Masm32 编 Win32 汇编程序的时候,我们并不需要记住 [ebp + xx] 等麻烦的地址,或自己计算局部变量需要预留的堆栈空间,还有在 ret 时计算要加上的数值,Masm32 的宏指令都已经把这些做好了,如在 Masm32 中,上面的程序只要写成为: MyProc proc Var1,Var2 local lVar1,lVar2 mov eax,Var1 sub eax,Var2 ret MyProc endp 编译...

汇编语言内存单元地址的算法

首先要了解的是CPU要处理的数据是存在内存中的,当CPU要处理某些数据时首先要将数据从内存中读取到CPU的寄存器中。内存的结构是以8个位(bit)为一个单元,由许多这样的单元组成了内存。就像一栋大楼是有许多个房间组成,每个房间的空间就是8个位。而数据存在内存的某一个或某一段单元中,CPU要读取怎么才能从这么多单元中找到呢,就是靠内存地址。内存地址就像我们的门牌号。有了这个,只要告诉CPU地址是多少,CPU就会从这段地址中读取数据。我们将内存中的一个单元的地址编为1,那么只要按顺序就会有2,3,4,5。。。。等等每个内存都会有个明确的地址编号。寻址范围,就是指CPU所能查找到的最小地址和最大地址。假如CPU的地址线是8位的,那么用二进制表示就是1111 1111。

也就是说CPU访问内存从最小的0000 0000这个单元,一直到1111 1111这个单元。这是二进制,转换成十进制就是255.也就是说,CPU可以访问的内存地址编号从0~255.这就是CPU的寻址范围。你的串号我已经记下,采纳后我会帮你制作

以下为关联文档:

本人汇编小菜鸟求大神汇编语言中我写的冒泡排序程序为什么不能“di=?” 不知道, [di] 传送到 bl、dl的是什么? bx的高位“bh=?”也不知道 ! 程序看着有点乱。给你一个子程序,你研究下: ;=============================== ; 单个字符串内部的排序...

汇编语言中几道简单的题目一、 (1)C:dw定义的是一个字(两个字节),故预留2*50=100个字节 (2)D:IN的功能是从外部设备读入数据 (3)A:SEGMENT/ENDS定义汇编语言源程序逻辑段 (4)B:物理地址=段地址(左移4位(二进制))+偏移...

如何在C语言中嵌入汇编在 Visual C++ 中使用内联汇编- - 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤。在 Visual C++ 中,内联汇编是内置的编译器,因此不需要...

EXTRN在汇编语言中是什么意思EXTRN在汇编语言: 一定要清楚这是伪指令 说明:在当前模块所使用的标识符中,哪些标识符是已在其它模块中被定义为指定类型的标识符。如果当前模块使用了其它模块的标识符,而对它...

汇编中的dec指令是什么指令寄存器存储指令。 CPU机器指令的助记符,编译后得到1和0组成的机器码,由CPU读取执行。为了让CPU处理起来更加的具有效率,CPU往往是一边执行指令的同时就在提前读取下面的指令了,...

汇编语言中的DEC是什么意思DEC 1. =Digital Equipment Corporation (美国)数字设备公司 2. =Data Equipment Company (美国)数据设备公司 3. DEC. 为英文December 的简写,中文译十二月。在通常的代表月份的...

汇编语言中怎么加入C语言第一题 直接嵌入汇编代码的方法: 1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragma ENDASM 2、在 Project 窗口中包含汇编...

c语言中如何调用汇编程序1、如果汇编程序是可执行文件,比如exe文件,则可以使用system函数直接调用。比如下面的代码,用system()打开windows上的记事本程序。#include #include int main(){system("notepa...

C语言中如何调用汇编子程序C语言中如何调用汇编子程序,用汇编语言编写子程序后如何调用:你是指内联汇编吧?比如下面这个例子: #include <stdio.h> int func(int a, int b) { return a - b; } int main() {...

推荐阅读
图文推荐