先看一个简单的汇编程序:
assume cs:code,ss:stack stack segment dw 10 dup('a') stack ends code segment start: mov ax,stack mov ss,ax mov sp,20 mov ax,1 mov cx,4 call s mov ax,4c00h int 21h s: add ax,ax loop s ret code ends end start
自定义一个stack段,然后产生一次方法调用,用ms的debug工具单步调试,可以看到编译后的代码里边s这个标号变成了offset:
-u 0B55:0000 B8530B MOV AX,0B53 0B55:0003 8ED0 MOV SS,AX 0B55:0005 BC1400 MOV SP,0014 0B55:0008 B80100 MOV AX,0001 0B55:000B B90400 MOV CX,0004 0B55:000E E80500 CALL 0016 0B55:0011 B8004C MOV AX,4C00 0B55:0014 CD21 INT 21 0B55:0016 03C0 ADD AX,AX 0B55:0018 E2FC LOOP 0016 0B55:001A C3 RET
call s在编译后对应的指令是:
0B55:000E E80500 CALL 0016
前边表示内存单元,即调试的时候把程序加载到了0b55:0开始的内存区域,而call s对应的机器码在0b55 * 16 + E的地方,E80500表示call s指令编译后的机器码,E8表示call指令,0500是s标号编译后的地址,由于call实际上等同于是call near ptr s,而near编译后是两个字节的值。而这里的5是offset,而不是绝对地址,call 后边的0016是根据call s下一条指令的地址0b55:0011加上这个offset计算出来的,也就是0b55:0016,由于call near ptr s是段内转移,所以段地址不变,即0b55,只显示0011了。
另外,从内存单元的机器码和其对应的汇编指令看,mov ax stack被编译成了:
0B55:0000 B8530B MOV AX,0B53即在0b53:0的位置,应该是我们栈的内存区域(为了更明显起见,我用dw 10 dup('a')初始化的栈内存区):
-d 0b53:0 0B53:0000 61 00 61 00 61 00 61 00-61 00 61 00 61 00 61 00 a.a.a.a.a.a.a.a. 0B53:0010 61 00 61 00 00 00 00 00-00 00 00 00 00 00 00 00 a.a............. 0B53:0020 B8 53 0B 8E D0 BC 14 00-B8 01 00 B9 04 00 E8 0D .S..............从0b53:0开始的16个word,word用两个字节存放,高字节存放在高地址,低字节存放在低地址,用word表示的a,是0061,按地址顺序存放后就成了6100了。
在开始执行前,先看下寄存器的信息:
-r AX=0000 BX=0000 CX=0043 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0B43 ES=0B43 SS=0B53 CS=0B55 IP=0000 NV UP EI PL NZ NA PO NC执行前两条条指令后,ss已经指向了0b53:
-t AX=0B53 BX=0000 CX=0043 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0B43 ES=0B43 SS=0B53 CS=0B55 IP=0003 NV UP EI PL NZ NA PO NC在执行call s之前,可以看到sp=0014,stack区域的数据却好像被什么改变了:
相关推荐
详细介绍汇编语言使用的所有寄存器
对汇编中使用到的主要寄存器及各种汇编指令进行了详细的描述,新手比较容量理解和接受。
总览汇编寄存器,方便记忆和复习。寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输, 但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字,而且有些还有多...
是汇编的一些寄存器知识,以及七大寻址方法的详解,适合新手学习
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可...在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC)。
了解汇编寄存器,看懂汇编语言函数调用关系,帮助程序员高蛋白调试。
寄存器-数据传送指令-算术运算指令-逻辑运算指令 等举例介绍
用汇编语言变成实现记录bl 寄存器中的1的个数
win32汇编寄存器的详细说明,详细介绍了每个寄存器的使用方式。
c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 ..................
比如si,di 之类的一些常规搭配和一些常用的用途。
8088汇编寄存器指令寻址 寄存器总数 所有的寻址方式
关于微机原理和汇编的课件,详细介绍了寄存器的内容,非常适合初学者学习.
单片机汇编语言和C语言混合调用资料及实例
王爽汇编语言 寄存器内存访问PPT学习教案.pptx
关于寄存器的相关问题,可以在这里找到答案。如果您希望增加嵌入式软件开发经验,这里有很多不错的资料!!!
arm基础知识(常见汇编、寄存器讲解、中断理解)
C体系结构与汇编语言寄存器实用PPT课件.pptx
C体系结构与汇编语言寄存器实用PPT学习教案.pptx
汇编语言课程\应用例子\读寄存器内容的源代码