2.10堆栈相关指令

合集下载

linux内核堆栈解析方法

linux内核堆栈解析方法

在 Linux 系统中,内核堆栈(kernel stack)用于执行内核代码。

当发生操作系统内核崩溃、内核出现异常或需要调试时,理解和分析内核堆栈十分重要。

以下是分析 Linux 内核堆栈的常用方法:使用dmesg:当内核发生故障时,错误信息和堆栈追踪通常会输出到内核日志。

你可以使用 dmesg 命令查看内核日志中的堆栈追踪。

dmesg | grep -i stack操作系统崩溃时的系统日志:有时通过分析内核崩溃时的系统日志(如/var/log/syslog 或/var/log/messages、/var/log/kern.log)也可以找到有关堆栈信息。

使用 dump_stack() 函数:在内核代码中,你可以使用 dump_stack() 函数打印当前线程的堆栈信息。

这在调试内核代码时非常有用。

系统核心转储(Core Dump):内核崩溃时,操作系统有时会生成系统核心转储文件。

你可以使用 GNU Debugger(GDB)来分析内核转储文件。

首先,安装 Linux 的调试符号表(debugging symbols),然后使用 gdb 命令加载符号表和内核转储文件,最后使用 bt(backtrace)命令查看堆栈追踪。

gdb path/to/vmlinux path/to/core_dump(gdb) bt请注意,要使内核生成核心转储文件,需要正确配置内核。

具体配置方法取决于你所使用的 Linux 发行版。

内核调试器(如 KGDB 和 KDB):如果你正在研究内核问题,可以使用内核调试器 KGDB 或 KDB。

KGDB 是基于 GDB 的内核调试器,可以在源代码级别进行调试。

KDB 则是一个基于文本的内核调试器。

使用这些工具,你可以从内核级别设置断点、单步执行代码、检查内存内容和调用堆栈等。

通过以上方法可以帮助你分析 Linux 内核堆栈。

如何选择最佳方法取决于你的具体需求和问题。

在进行内核调试之前,请确保熟悉 Linux 操作系统和内核开发的基本知识。

汇编语言复习重点(王爽)

汇编语言复习重点(王爽)

汇编语言(教材王爽)期末考试复习:考试题型:选择、填空、程序分析、编程题一、重点复习课本的检测点1.1-3.2与课后实验1-14:二、需要掌握的指令见后面附录三、汇编语言主要知识点:寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。

. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。

2. 存储器分段管理. 解决了16位寄存器构成20位地址的问题. 便于程序重定位. 20位物理地址=段地址 * 16 + 偏移地址. 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。

3. 堆栈. 堆栈是一种先进后出的数据结构 , 数据的存取在栈顶进行 , 数据入栈使堆栈向地址减小的方向扩展。

. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。

. 堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。

执行指令后,一般源操作数不变,目的操作数被计算结果替代。

. 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。

2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。

. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式--将常量赋给寄存器或存储单元(2) 直接寻址方式--存取单个变量(直接给出地址值或变量名)(3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式--访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式课本P164(7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP. 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址--段内直接转移或子程序调用(2) 段内间接寻址--段内间接转移或子程序调用(3) 段间直接寻址--段间直接转移或子程序调用(4) 段间间接寻址--段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。

微机原理课后习题参考答案

微机原理课后习题参考答案

微机原理课后习题参考答案第1部分微型计算机基础知识1.1 微处理器、微型计算机和微型计算机系统三者之间有什么不同?【解】微处理器:指计算机内部对数据进行处理并对处理过程进行控制的部件,伴随着大规模集成电路技术的迅速发展,芯片集成密度越来越高,CPU可以集成在一个半导体芯片上,这种具有中央处理器功能的大规模集成电路器件,被统称为“微处理器”。

微型计算机:简称“微型机”、“微机”,也称“微电脑”。

由大规模集成电路组成的、体积较小的电子计算机。

由微处理机(核心)、存储片、输入和输出片、系统总线等组成。

特点是体积小、灵活性大、价格便宜、使用方便。

微型计算机系统:简称“微机系统”。

由微型计算机、显示器、输入输出设备、电源及控制面板等组成的计算机系统。

配有操作系统、高级语言和多种工具性软件等。

1.2 CPU在内部结构上由哪几部分组成?CPU应该具备哪些主要功能?【解】CPU在内部结构上由运算器、控制器、寄存器阵列和内部总线等各部分构成,其主要功能是完成各种算数及逻辑运算,并实现对整个微型计算机控制,为此,其内部又必须具备传递和暂存数据的功能。

1.3 微型计算机采用总线结构有什么优点?【解】①简化了系统结构,便于系统设计制造;②大大减少了连线数目,便于布线,减小体积,提高系统的可靠性;③便于接口设计,所有与总线连接的设备均采用类似的接口;④便于系统的扩充、更新与灵活配置,易于实现系统的模块化;⑤便于设备的软件设计,所有接口的软件就是对不同的口地址进行操作;⑥便于故障诊断和维修,同时也降低了成本。

总线的逻辑电路有些是三态的,即输出电平有三种状态:逻辑“0”,逻辑“1”和“高阻”态。

1.4计算机总线有哪些,分别是什么?【解】总线按其信号线上传输的信息性质可分为三组:①数据总线,一般情况下是双向总线;②地址总线,单向总线,是微处理器或其他主设备发出的地址信号线;③ 控制总线,微处理器与存储器或接口等之间1.5 数据总线和地址总线在结构上有什么不同之处?如果一个系统的数据和地址合用一套总线或者合用部分总线,那么要靠什么来区分地址和数据?【解】数据总线(DB)为双向结构,数据在CPU与存储器或I/O 接口之间的传送是双向的,(数据既可以读也可以写),其宽度通常与微处理器的字长相同。

微机原理和接口技术课后习题答案周明德

微机原理和接口技术课后习题答案周明德

微机课后习题答案第一章:1.1 IA- 32结构微处理器直至Pentium4,有哪几种?8086. 80286.80386.80486.Pentium.Pentium MMX. Pentium Pro. Pentium Ⅱ. Pentium Ⅲ1.2 80386和8086在功能上有哪些区别?(1)从16位扩展为32位(2)从保护模式到实模式(3)片内存储管理单元1.3 80486和80386在功能上有哪些区别浮点支持1.4 Pentium相对于80486在功能上有什么扩展?(1)页从4KB扩展到4MB(2)内部寄存器仍是32位,但为了加快数据传送,内部数据总线是128和256位,外部数据总线是64位(3)增加了可编程中断控制器,以支持多个奔腾处理器系统(4)Pentium MMX引入了多媒体扩展指令集技术(MMX)1.5 Pentium Ⅱ以上的处理器采用了什么结构。

P6系列的超标量微结构。

1.6徽处理器、微型计算机和微型计算机系统三者之间有什么不同?微处理器:将cpu集成在一块集成电路芯片上。

微型计算机:由微处理器,存储器,输入输出接口电路和输入输出设备组成。

微型计算机系统:由微型计算机与运行、管理、维护计算机的软件组成。

1.7 CPU在内部结构上由哪几部分组成?CPU应该具备哪些主要功能?组成:内部寄存器阵列,累加器和算术逻辑单元,指令寄存器,指令译码器和控制信号的产生电路。

功能:进行算术逻辑运算,控制计算机按照程序的规定运行。

1.8 微型计算机采用总线结构的优点。

增加了数据传送了灵活性,减少了芯片之间的连线,因而减少了连线所占的面积。

且总线可以标准化,有利于工业生产和兼容。

1.9数据总线和地址总线在结构上有什么不同之处?如果一个系统的数据和地址合用一套总线或者合用部分总线,那么要靠什么来区分地址和数据?区别:数据总线是双向的,地址总线是单向的。

区分:地址总线和数据总线是分时复用的,它们主要靠信号的时序来区分,通常在读写数据时,先发送地址,然后再将数据送到数据总线上。

汇编语言指令大全

汇编语言指令大全

AAA 未组合的十进制加法调整指令AAA(ASCII Adgust for Addition)格式: AAA功能: 对两个组合的十进制数相加运算(存在AL中)的结果进行调整,产生一个未组合的十进制数放在AX中. 说明:1. 组合的十进制数和未组合的十进制数:在计算中,十进制数可用四位二进制数编码,称为BCD码.当一个节(8位)中存放一位BCD码,且放在字节的低4位, 高4位为时称为未组合的BCD码.2. AAA的调整操作若(AL) and 0FH>9 或 AF=1,则调整如下:(AL)<--(AL)+6,(AH)<--(AH)+1,AF=1, CF<--AF,(AL)<--(AL) and 0FHAAD 未组合十进制数除法调整指令AAD(ASCII Adjust for Division)格式: AAD功能: 在除法指令前对AX中的两个未组合十进制数进行调整,以便能用DIV指令实现两个未组合的十进制数的除法运算,其结果为未组合的十进制数,商(在AL中)和余数(在AH中). 说明:1. AAD指令是在执行除法DIV之前使用的,以便得到二进制结果存于AL中,然后除以OPRD,得到的商在AL中,余数在AH中.2. 示例: MOV BL,5MOV AX,0308HAAD ;(AL)<--1EH+08H=26H,(AH)<--0 DIV BL ;商=07H-->(AL),余数=03H-->(AH).AAM 未组合十进制数乘法调整指令AAM(ASCII Adjust MULtiply)格式: AAM功能: 对两个未组合的十进制数相乘后存于AX中的结果进行调整,产生一个未组合的十进制数存在AL中. 说明:1. 实际上是两个未组合的十进制数字节相乘,一个0~9的数与另一个0~9的数相乘其积最大为81.为了得到正确的结果,应进行如下调整:乘积: (AH)<--(AL)/10(AL)<--(AL)MOD102. 本指令应跟在MUL指令后使用,乘积的两位十进制结果,高位放在AH中,低位放在AL中.AH内容是MUL指令的结果被10除的商,即(AL)/10,而最后的AL内容是乘积被10整除的余数(即个位数).AAS 未组合十进制减法调整指令 AAS(ASCII Adjust for Subtraction)格式: AAS功能: 对两个未组合十进制数相减后存于AL中的结果进行调整,调整后产生一个未组合的十进制数数且仍存于AL中. 说明:1. 本指令影响标志位CF及AF.2. 调整操作若(AL) and 0FH > 9 或 AF=1则(AL)<--(AL)-6,(AH)<--(AH)-1,CF<--AF,(AL)<--(AL) and 0FH,否则(AL)<--(AL) and 0FHADC 带进位加法指令 ADC(Addition Carry) 格式: ADC OPRD1,OPRD2功能: OPRD1<--OPRD1 + OPRD2 + CF 说明:1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数. OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数.2. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数.3. 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响.以上标志也称为结果标志.4. 该指令对标志位的影响同ADD指令.ADD 加法指令 ADD(Addition)格式: ADD OPRD1,OPRD2功能: 两数相加说明:1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数. OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数.2. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器操作数.3. 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响.以上标志也称为结果标志.加法指令适用于无符号数或有符号数的加法运算.AND 逻辑与运算指令 AND格式: AND OPRD1,OPRD2功能: 对两个操作数实现按位逻辑与运算,结果送至目的操作数.本指令可以进行字节或字的‘与’运算,OPRD1<--OPRD1 and OPRD2. 说明:1. 目的操作数OPRD1为任一通用寄存器或存储器操作数.源操作数OPRD2为立即数,任一通用寄存器或存储器操作数.2. 示例: AND AL,0FH ;(AL)<--(AL) AND 0FHAND AX,BX ;(AX)<--(AX) AND (BX) AND DX,BUFFER[SI+BX]AND BETA[BX],00FFH注意: 两数相与,有一个数假则值为假CALL 过程调用指令 CALL格式: CALL OPRD 说明:1. 其中OPRD为过程的目的地址.功能: 过程调用指令 2. 过程调用可分为段内调用和段间调用两种.寻址方式也可以分为直接寻址和间接寻址两种.3. 本指令不影响标志位.CBW 字节扩展指令 CBW(Convert Byte to Word)格式: CBW功能: 将字节扩展为字,即把AL寄存器的符号位扩展到AH中. 说明:1. 两个字节相除时,先使用本指令形成一个双字节长的被除数.2. 本指令不影响标志位.3. 示例: MOV AL,25CBW IDIV BYTE PTR DATA1CLC 处理器控制指令-标志位操作指令格式:CLC ;置CF=0STC ;置CF=1CMC ;置CF=(Not CF)进位标志求反CLD ;置DF=0STD ;置DF=1CLI ;置IF=0,CPU禁止响应外部中断STI ;置IF=1使CPU允许向应外部中断功能: 完成对标志位的置位、复位等操作. 说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操作指令执行时,按增量的方式修改吕指针.CLD 处理器控制指令-标志位操作指令格式:CLC ;置CF=0STC ;置CF=1CMC ;置CF=(Not CF)进位标志求反CLD ;置DF=0STD ;置DF=1CLI ;置IF=0,CPU禁止响应外部中断STI ;置IF=1使CPU允许向应外部中断功能: 完成对标志位的置位、复位等操作. 说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操作指令执行时,按增量的方式修改吕指针.CLI 处理器控制指令-标志位操作指令格式:CLC ;置CF=0STC ;置CF=1CMC ;置CF=(Not CF)进位标志求反CLD ;置DF=0STD ;置DF=1CLI ;置IF=0,CPU禁止响应外部中断STI ;置IF=1使CPU允许向应外部中断功能: 完成对标志位置位、复位等操作. 说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操作指令执行时,按增量的方式修改吕指针.CMC 处理器控制指令-标志位操作指令格式: 说明: 例如串操作中的程序,经常用CLD指令清方向标志使DF=0,在串操CLC ;置CF=0STC ;置CF=1CMC ;置CF=(Not CF)进位标志求反CLD ;置DF=0STD ;置DF=1CLI ;置IF=0,CPU禁止响应外部中断STI ;置IF=1使CPU允许向应外部中断功能: 完成对标志位的置位、复位等操作. 作指令执行时,按增量的方式修改吕指针.CMP 比效指令 CMP(CoMPare)格式: CMP OPRD1,OPRD2功能: 对两数进行相减,进行比较. 说明:1. OPRD1为任意通用寄存器或存储器操作数.OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD2.2. 对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较.3. 在8088/8086指令系统中,专门提供了一组根据带符号数比较大小后,实现条件转移的指令.CMPS 字符串比较指令格式: CMPS OPRD1,OPRD2CMPSBCMPSW功能: 由SI寻址的源串中数据与由DI寻址的目的串中数据进行比较,比较结果送标志位,而不改变操作数本身.同时SI,DI将自动调整. 说明:1. 其中OPRD2为源串符号地址,OPRD1为目的串符号地址.2. 本指令影响标志位AF、CF、OF、SF、PF、ZF.本指令可用来检查二个字符串是否相同,可以使用循环控制方法对整串进行比较.3. 与MOVS相似,CMPS指令也可以不使用操作数,此时可用指令CMPSB或CMPSW分别表示字节串比较或字串比较.CMPSB 字符串比较指令格式: CMPS OPRD1,OPRD2CMPSBCMPSW功能: 由SI寻址的源串中数据与由DI寻址的目的串中数据进行比较,比较结果送标志位,而不改变操作数本身.同时SI,DI将自动调整. 说明:1. 其中OPRD2为源串符号地址,OPRD1为目的串符号地址.2. 本指令影响标志位AF、CF、OF、SF、PF、ZF.本指令可用来检查二个字符串是否相同,可以使用循环控制方法对整串进行比较.3. 与MOVS相似,CMPS指令也可以不使用操作数,此时可用指令CMPSB或CMPSW分别表示字节串比较或字串比较CMPSW 字符串比较指令格式: CMPS OPRD1,OPRD2 说明:1. 其中OPRD2为源串符号地址,OPRD1CMPSBCMPSW功能: 由SI寻址的源串中数据与由DI 寻址的目的串中数据进行比较,比较结果送标志位,而不改变操作数本身. 同时SI,DI将自动调整. 为目的串符号地址.2. 本指令影响标志位AF、CF、OF、SF、PF、ZF.本指令可用来检查二个字符串是否相同,可以使用循环控制方法对整串进行比较.3. 与MOVS相似,CMPS指令也可以不使用操作数,此时可用指令CMPSB或CMPSW分别表示字节串比较或字串比较.CWD 字扩展指令 CWD(Convert Word toDouble Word)格式: CWD功能: 将字扩展为双字长,即把AX寄存器的符号位扩展到DX中. 说明:1. 两个字或字节相除时,先用本指令形成一个双字长的的被除数.2. 本指令不影响标志位.3. 示例: 在B1、B2、B3字节类型变量中,分别存有8们带符号数a、b、c,实现(a*b+c)/a运算。

微机原理和接口技术课后习题答案周明德

微机原理和接口技术课后习题答案周明德

微机课后习题答案第一章:1.1 IA- 32结构微处理器直至Pentium4,有哪几种?8086. 80286.80386.80486.Pentium.Pentium MMX. Pentium Pro. Pentium Ⅱ. Pentium Ⅲ1.2 80386和8086在功能上有哪些区别?(1)从16位扩展为32位(2)从保护模式到实模式(3)片内存储管理单元1.3 80486和80386在功能上有哪些区别浮点支持1.4 Pentium相对于80486在功能上有什么扩展?(1)页从4KB扩展到4MB(2)内部寄存器仍是32位,但为了加快数据传送,内部数据总线是128和256位,外部数据总线是64位(3)增加了可编程中断控制器,以支持多个奔腾处理器系统(4)Pentium MMX引入了多媒体扩展指令集技术(MMX)1.5 Pentium Ⅱ以上的处理器采用了什么结构。

P6系列的超标量微结构。

1.6徽处理器、微型计算机和微型计算机系统三者之间有什么不同?微处理器:将cpu集成在一块集成电路芯片上。

微型计算机:由微处理器,存储器,输入输出接口电路和输入输出设备组成。

微型计算机系统:由微型计算机与运行、管理、维护计算机的软件组成。

1.7 CPU在内部结构上由哪几部分组成?CPU应该具备哪些主要功能?组成:内部寄存器阵列,累加器和算术逻辑单元,指令寄存器,指令译码器和控制信号的产生电路。

功能:进行算术逻辑运算,控制计算机按照程序的规定运行。

1.8 微型计算机采用总线结构的优点。

增加了数据传送了灵活性,减少了芯片之间的连线,因而减少了连线所占的面积。

且总线可以标准化,有利于工业生产和兼容。

1.9数据总线和地址总线在结构上有什么不同之处?如果一个系统的数据和地址合用一套总线或者合用部分总线,那么要靠什么来区分地址和数据?区别:数据总线是双向的,地址总线是单向的。

区分:地址总线和数据总线是分时复用的,它们主要靠信号的时序来区分,通常在读写数据时,先发送地址,然后再将数据送到数据总线上。

汇编指令大全+很全的汇编指令

汇编指令大全+很全的汇编指令

for Addition)
1. 调整操作如下
格式: DAA
(1) 若(AL) and 0FH>9 或 AF=1
,则(AL)<--(AL)+6,AF<--1,对低
功能: 对AL中的两个组合进制数相加的结果进行调 四位的调整.
整,调整结果仍放在AL中,进位标志放在CF中.
(2) 若(AL) and 0F0H>90H 或
6 LAHF 标志传送指令 LAHF 格式: LAHF
2. 本指令不影响状态标位,表格 长度不超过256字节.
说明: 该指令不影响FLAG的原来 内容,AH只是复制了原FLAG的低8 位内容.
功能: 取FLAG标志寄存器低8位至AH寄存器.(AH)<-
-(FLAG)7~0
7 SAHF 标志传送指令 SAHF
说明:
格式: DEC OPRD 功能: OPRD<--OPRD-1
1. OPRD 为寄存器或存储器操作 数.
2. 这条指令执行结果影响AF、 OF、PF、SF、ZF标志位,但不影 响CF标志位.
页码,4/22
星尘-易尘
302 NEG 303 CMP
304 AAS 305 DAS 306 MUL
取补指令 NEG(NEGate)
未组合的十进制加法调整指令 AAA(ASCII Adgust 说明:
for Addition)
1. 组合的十进制数和未组合的
格式: AAA
十进制数:在计算中,十进制数可
用四位二进制数编码,称为BCD
功能: 对两个组合的十进制数相加运算(存在AL中) 码.
的结果进行调整,产生一个未组合的十进制数放在
AX中.
SUB [BX+25],AX

《微机原理、汇编语言与接口技术》韩晓茹(习题解答全套

《微机原理、汇编语言与接口技术》韩晓茹(习题解答全套
数据总线DB用于传送数据信息,数据总线是双向三态形式。
地址总线AB是专门用来传送地址的,地址总线总是单向三态的。
控制总线CB用来传送控制信号和时序信号,制总线的传送方向由具体控制信号而定。
1.4衡量微型计算机系统的性能的指标有哪些?
答:衡量微型计算机系统的性能的指标有字长、主频、运算速度和主存容量和存取速度。字长是指微机系统中CPU一次能处理的二进制位数。CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。运算速度是指每秒钟所能执行的指令条数。主存储器容量指内部存储器能存放数据的最大字节数。存取速度指主存完成一次读/写所需要的时间。
2.3简述伪指令“EQU”与“=”之间有什么区别?
解:“EQU”伪指令不能重复定义,而“=”伪指令可以重复定义。
2.4画图说明下列语句分配的存储空间及初始化的数值
(1)FF1DB'0100',2+5,?,'ABC'
(2)FF2DW2 DUP(?),'A','BC',1000H,25H
(3)FF3DB2 DUP(1,2 DUP(2,3),4)
(3)LEA BX, BLOCK
MOV SI, 99*2
MOV AX,[BX+SI]
或:
LEA SI, BLOCK
MOV BX, 99*2
MOV AX,[BX+SI]
2.9已知:(BX)=1200H,(BP)=2400H,(SI)=0100H,(DI)=0200H,(SS)=1000H,(DS)=2000H,(ES)=3000H,变量VAR1对应地址为2000H,试分别指出下列指令中存储器的寻址方式及物理地址。
2.28086/8088 CPU中标志寄存器有哪两类标志?简述各标志位的含义。

51单片机堆栈操作指令举例说明

51单片机堆栈操作指令举例说明

什么是堆栈?MCS-51单片机的堆栈怎样设置的?答:程序设计时,往往需要一个后进先出的RAM区,以保存CPU的现场。

这种后进先出的缓冲区,就称为堆栈。

MCS-51单片的堆栈原则上设在内部RAM的任意区域内。

但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。

51单片机堆栈操作指令举例说明时间:2009-03-02 18:46来源:未知作者:牛牛点击:149次这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP 所指单元的内容送到直接寻址单元中。

这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。

需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。

入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。

堆栈操作指令有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。

推入指令的执行过程是,首先将SP中的值加1,然后把SP 中的值当作地址,将direct中的值送进以堆栈操作指令有两条:PUSH directPOP direct第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。

推入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。

例:MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。

W354-计算机组成-计算机组成原理—习题解答(第二章)

W354-计算机组成-计算机组成原理—习题解答(第二章)

计算机组成与设计第二章习题解❒2.4一般来说,CISC比RISC的指令复杂,因此可以用较少的指令完成相同的任务。

然而,由于指令的复杂,一条CISC指令需要花费比RISC更多的时间来完成。

假设一个任务需要P条CISC指令或者2P条RISC指令,完成每条CISC指令花费8Tns,每条RISC指令花费2Tns。

在此假设下,哪一种指令系统性能更好?❒题解:P×8 > 2P×2RISC性能更好❒2.5 ASCII码是7位,如果设计主存单元字长为31位,指令字长为12位,是否合理?为什么?❒题解此设计方案不合理。

其原因是:①ASCII码是7位,通常加一位校验位为8位,以字节为单位进行处理比较方便。

故主存应设计成按字节编址,这种编址方式下一般主存单元字长应取字节长度的2、4、8倍。

若按8位标准字节设计,主存字长取32位比较合适,取31位显然不合理。

②一般指令字长应与机器字长或字节长度间有整数倍关系,若主存设计成按字节编址方式,则指令字长取单字节、双字节等较合适,取12位显然不合理。

❒2.6 在某些计算机中,子程序调用是以下述方法实现的:转子指令将返回地址(即主程序中该指令的下一条指令地址)存入子程序的第一单元,然后转到第二个单元开始执行子程序。

(1)设计一条相应的从子程序返回主程序的指令;(2)在这种情况下,你怎样在主、子程序间进行参数的传递?(3)上述调用方法是否可用于子程序嵌套?(4)上述调用方法是否可用于子程序多重嵌套时的递归调用(即某个子程序调用它本身)?如果改用堆栈链接方法,是否可实现此问题?❒题解:(1)返回指令是一地址指令,其格式如下:这是一条间接寻址的无条件转移指令。

其中,I为间接寻址标志,K为子程序在主存第一单元的地址。

(2)在这种情况下,可利用寄存器或主存单元进行主、子程序之间的参数传递。

(3)可以用于子程序的嵌套(多重转子程序),因为每个返回地址都存放在被调用的子程序的第一个单元中。

汇编语言常用指令大全

汇编语言常用指令大全

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。

微机原理与接口技术:堆栈操作

微机原理与接口技术:堆栈操作

(2)PUSH,POPPUSH和POP是堆栈操作指令助记符。

堆栈是程序在内存中开辟的一个数据区,用以保存寄存器或存储器中暂时不用而又必须保存的数据。

程序中堆栈是用段定义语句在内存中定义的一个堆栈段,堆栈段的段基址存放在SS寄存器,段内偏移地址存放在SP寄存器中,SP也常称为堆栈指针,它总是指向栈顶。

堆栈是一种线性表,只在栈顶(低地址端)进行输入输出操作。

CPU对堆栈的操作采用先进后出(或后进先出)存取方法。

CPU把数据存入堆栈称为压入堆栈PUSH,从堆栈中取出数据称为弹出堆栈POP。

压入堆栈时堆栈增长,堆栈指针SP减小,向低地址方向移动;弹出堆栈时堆栈减小,堆栈指针SP增大,向高地址方向(栈底)移动。

如图3-6所示。

指令格式:PUSH src ;压栈指令POP dst ;出栈指令PUSH指令把操作数压入堆栈,执行过程为:①src 的高8位存入[SP-1],src 的低8位存入[SP-2]②SP-2送SP例如:设SS=2000H,SP=102H,AX=623EH,执行下面指令后:PUSH AXAX的数据62H存入20101H单元,3EH存入20100H单元,SP=0100H,如图3-6所示。

POP指令把操作数弹出到dst中,执行过程为:①把[SP]的内容弹出到dst的低8位,把[SP+1]的内容弹出到dst的高8位②SP+2 送SP例如:设SS=2000H,SP=102H,执行下面指令后:POP AXSS=2000H,SP=104H,AX=79FFH,如图3-6所示。

堆栈操作指令属于单操作数指令,操作数可以是寄存器,也可以是存储器。

堆栈指令的操作数必须是字类型,可以是16位的通用寄存器或段寄存器,也可以是两个连续的内存单元,可以采用任何寻址方式。

8086CPU不允许立即数作为堆栈操作的操作数,CS不能作为出栈指令的操作数。

堆栈指令不影响任何标志位。

例如:PUSH DIPUSH DSPUSH CSPUSH WORD PTR[1000H]PUSH WORD PTR[SI]PUSH WORD PTR[BP+6]POP SIPOP DSPOP WORD PTR[1000H]POP WORD PTR[SI]POP WORD PTR[BX+DI]堆栈操作常用来传递函数的参数。

《微机原理与接口技术》作业(修订)

《微机原理与接口技术》作业(修订)

*教材:中国科大《微型计算机原理与接口技术》第5版*思考题:不用写在作业本,不用上交作业;*书面题:z写在作业本上,周一上课前上交作业;z作业本必须有封面,写清课程名、班级、学号、姓名;z作业题标清题号,抄写题目;z答题留有间隙或空行。

CH1思考题:1-5、10、11、13【1.1】将下列二进制数转换成10进制数。

(1)11001010B (2)00111101B (3)01001101B (4)10100100B 【1.2】将下列16进制数转换成10进制数。

(1)12CH (2)0FFH (3)3A8DH (4)5BEH 【1.3】将下列10进制数分别转换成二进制数和16进制数。

(1)25 (2)76 (3)128 (4)134【1.4】求出下列10进制数的BCD码(压缩的BCD码和非压缩的BCD码)。

(1)327 (2)1256【1.5】将英文单词About和数字95转换成ASCII码字符串。

【1.6】求出下列10进制数的原码、反码和补码【1.7】冯•诺依曼结构的计算机由哪几部分组成?大致是如何工作的?【1.8】计算机的硬件和软件分别指什么?【1.9】什么是机器语言、汇编语言和高级语言?【1.10】画出微型计算机的基本结构框图,说明各部分的主要功能是什么。

【1.11】微型计算机系统由哪些部分组成?【1.12】说明下列名称的英文全称和中文含义。

(1)ALU (2)CPU (3)PC (4)DOS 【1.13】 8086和80386各有多少根地址总线?可直接寻址的内存空间各是多少?它们的数据总线各有多少根?CH2思考题:2-4、6、10、13-14、17-18书面题:1、5、7-9、11-12【2.1】 8086/8088CPU可直接寻址多少个内存(字节)单元?多少I/O端口?它们的外部数据总线各有多少根?【2.2】 8086CPU内部由哪两部分组成?它们大致是如何工作的?【2.3】 CPU、EU、BIU的英文全称和中文含义各是什么?【2.4】 8086CPU内部有哪些寄存器?各有什么用途?【2.5】两个带符号数1011 0100B和1100 0111B相加,运算后各标志位的值等于多少?哪些标志位是有意义的?如果把这两个数当成无符号数,相加后哪些标志位是有意义的?(参考例2.2)【2.6】说明8086引脚信号的功能:AD15~AD0、A19/S6~A16/S3、’RD、’WR、M/’IO、CLK、RESET、INTR、NMI、ALE、DT/’R、’DEN。

《计算机原理与接口技术》课后题答案

《计算机原理与接口技术》课后题答案

第2章微型计算机基础2.8 在执行指令期间,BIU能直接访问存储器吗?为什么?解:可以.因为EU和BIU可以并行工作,EU需要的指令可以从指令队列中获得,这时BIU预先从存储器中取出并放入指令队列的。

在EU执行指令的同时,BIU 可以访问存储器取下一条指令或指令执行时需要的数据。

2.9 8086与8088CPU的主要区别有哪些?解:主要区别有以下几点:①8086的外部数据总线有16位,而8088的外部数据总线只有8位。

②8086指令队列深度为6个字节,而8088的指令队列深度为4个字节.③因为8086的外部数据总线有16位,故8086每个总线周期可以存取两个字节.而8088的外部数据总线因为只有8位,所以每个总线周期只能存取1个字节.④个别引脚信号的含义稍有不同.2.10 解:(1)要利用信号线包括WR#、RD#、IO/M#、ALE 以及AD0~AD7、A8~A19。

(2)同(1)。

(3)所有三态输出的地址信号、数据信号和控制信号均置为高阻态。

2.11解:在每个总线周期的T3的开始处若READY 为低电平,则CPU在T3后插入一个等待周期TW。

在TW的开始时刻,CPU还要检查READY状态,若仍为低电平,则再插入一个TW 。

此过程一直进行到某个TW开始时,READY已经变为高电平,这时下一个时钟周期才转入T4。

可以看出,插入TW周期的个数取决于READY电平维持的时间。

2.14 解:通用寄存器包含以下8个寄存器:AX、BX、CX和DX寄存器一般用于存放参与运算的数据或运算的结果。

除此之外:AX:主要存放算术逻辑运算中的操作数,以及存放I/O操作的数据。

BX:存放访问内存时的基地址。

CX:在循环和串操作指令中用作计数器。

DX:在寄存器间接寻址的I/O指令中存放I/O地址。

在做双字长乘除法运算时,DX与AX合起来存放一个双字长数。

SP:存放栈顶偏移地址。

BP:存放访问内存时的基地址。

SP和BP也可以存放数据,但它们的默认段寄存器都是SS。

汇编语言习题-测验题答案

汇编语言习题-测验题答案

汇编语言各章习题、测试题答案习题一1.1 分别将下列二进制数作为无符号数和带符号数转换为十进制和十六进制数11010011 01110111 10000011 00101111 101010101.2 十六进制运算1A52H+4438H 3967H-2D81H 37H×12H 1250H×4H1.3 将十进制数变为8位补码并做运算(结果用二进制、十六进制、十进制表示)29+53 73-24 -66+82 -102-151.4 用压缩BCD码计算(结果用二进制、BCD码、十进制表示)29+53 73-24 66+18 132+751.5 符号位扩展(字节扩展为字,字扩展为双字)20A3H 94H 3456H 7FH EC00H1.6 若机器字长为16位,其无符号数表示范围是多少?带符号数表示范围是多少?分别用十进制和十六进制表示。

1.7 写出下列十六进制数所能代表的数值或编码:(1)38H (2)FFH (3)5AH (4)0DH1.8 将下列十进制数分别转换为二进制、十六进制、二进制补码、压缩BCD码和ASCII码:(1)108 (2)46 (3)-15 (4)2541.9 写出下列算式的8位二进制运算结果,标志位CF、SF、ZF、OF分别是什么值?(1)56+63 (2)83-45 (3)-74+29 (4)-12-371.10 查表,指出ASCII码0DH、0AH、07H、1BH、20H、60H、50H、70H对应的控制字符。

测验一单选题:1.已知X=76,则[X]补= 。

A. 76HB. 4CHC.0B4HD.0CCH2.已知[X]补=80H,则X= 。

A. 80HB. 0C. 0FFHD. -80H3.已知[X]补=98H,则[X]补/2= 。

A. 0CCHB.4CHC. 49HD. 31H4.已知X=78,Y=-83,则[X+Y]补= 。

A. 0F5HB. 0A1HC. 0FBHD. 65H5.将124转换成十六进制数的结果是A. 7CHB. 7DHC. 7EHD. 7BH6.将93H看成一个压缩BCD码,其结果是A. 10010101B. 10010011C.10000011D.100000017.45转换成二进制数是A.10101101B.00111101C. 00101101D. 100111018.6CH转换成十进制数是A. 118B. 108C. 48D. 689.将93H扩展为字的结果是A. FF93HB. 0093HC. 1193HD. 1093H10.56的压缩BCD码是A. 38HB. 56HC. 0506HD. 3536H11.ASCII中的47H表示的字符是A. “7”B. “G”C. “g”D. “E”12.十进制数-128的8位二进制数的补码为A. 11111110B. 01111111C. 10000000D. 1000000113.下列为补码表示,其中真值最大的是A. 10001000B.11111111C.00000000D.0000000114.十六进制数88H,可表示成下面几种形式,请找出错误的表示A. 无符号十进制数136B. 带符号十进制数-120C. 压缩BCD码十进制数88D. 8位二进制数-8的补码15.计算机对字符、符号采用统一的二进制编码。

汇编语言各种指令的解释与用法

汇编语言各种指令的解释与用法

【】一、通用数据传送指令1、传送指令MOV (move)指令的汇编格式:MOV DST,SRC指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址。

指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令。

指令的执行对标志位的影响:不影响标志位。

指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器;目的操作数DST不能是CS,也不能用立即数方式。

2、进栈指令PUSH (push onto the stack)出栈指令 POP (pop from the stack)指令的汇编格式:PUSH SRC ;POP DST指令的基本功能:PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。

PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC)POP DST (DST)<-((SP));(SP)<-(SP)指令支持的寻址方式:push 和 pop指令不能不能使用立即数寻址方式。

指令对标志位的影响:PUSH 和 POP指令都不影响标志位。

指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字数据后,SP的修改必须是+2 或者 -2; POP指令的DST不允许是CS寄存器;3、交换指令XCHG (exchange)指令的汇编格式:XCHG OPR1,OPR2指令的基本功能:(OPR1)<->(OPR2)指令支持的寻址方式:一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。

指令对标志位的影戏:不影响标志位。

指令的特殊要求:不允许使用段寄存器。

二、累加器专用传送指令4、输入指令IN (input)输出指令 OUT (output)指令的汇编格式:IN ac,port port<=0FFHIN ac,DX port>0FFHOUT port,ac port<=0FFHOUT DX,ac port>0FFH指令的基本功能:对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。

s7-200PLC逻辑堆栈的操作

s7-200PLC逻辑堆栈的操作

处理最后一条支路时,必须使用LPP指令。一个独立电路块中,用入栈指
令同时保存在堆栈中的运算结果不能超过8个。
图b中 第一条LPS指令将A点的运算结果保存到堆栈的第1层;
第二条LPS指令将B点的运算结果保存到堆栈的第2层,A点的运算 结果被“压”到堆栈的第3层;
第一条LPP指令将堆栈第2层B点的运算结果上移到栈顶,第3层中A
直至第三个脉冲到来时,M0.0又产生一个扫描周期的单脉冲,使M0.0的常开触点闭合, 由于Q0.0的常开触点断开,M0.1线圈断开,其常闭触点M0.1闭合,Q0.0的线圈又接通并 自保持。
以后循环往复,不断重复上过程。由图可见,输出信号Q0.0是输入信号I0.0的二分频。
LD I0.0 EU = M0.0 LD M0.0 A Q0.0 = M0.1 LD M0.0 O Q0.0 AN M0.1 = Q0.0
Slide 10
两个扫描周期
图 分频电路
分频电路动作过程
基本位逻辑指令应用举例
6.1
图 分频电路时序图
Slide 11
(2)I/O分配表
六、抢答器程序设计
6.1
输入 I0.0 I0.1 I0.2 I0.3
S0 //主持席上的复位按钮 S1 //抢答席1上的抢答按钮 S2 //抢答席2上的抢答按钮 S3 //抢答席3上的抢答按钮
Slide 1
九、逻辑堆栈的操作
6.1
LPS、LRD、LPP指令的操作过程如图所示。 图中IV.X为存储在栈区的断点的地址。

后图
Slide 2
指令格式
九、逻辑堆栈的操作
6.1
逻辑堆栈指令可 以嵌套使用,最 多为9层。
LD I0.0 LPS LD I0.1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.10 堆栈相关指令本节必须掌握的知识点:本节介绍堆栈相关的知识,在介绍之前,我们回顾一下DTDebug.exe界面,首先打开DTDebug.exe软件,将飞鸽软件拖到DTDebug.exe软件中,如图2-10-1所示,DTDebug.exe界面包括汇编窗口、寄存器窗口、内存窗口、堆栈窗口,本节主要介绍堆栈窗口和寄存器窗口中的两个寄存器,这两个寄存器分别为ESP、EBP。

2.10.1【堆栈知识点】我们知道每个应用程序都有独立的4GB内存空间,是不是当前运行的应用程序拥有的4GB内存空间都可以使用哪?当然不是,虽然说名义上有4GB内存空间,但是在你真正要用某一块内存时,一定要向操作系统申请,换句话说你要告诉操作系统,我们把这个过程称为内存申请。

不同的语言,在申请内存时写法是不同的,但他们的本质是相同的,都是申请内存。

至于怎么申请,怎么实现,由于我们当前的进度还没有介绍到C语言,所以就不介绍了。

堆栈就是一块内存,操作系统启动时已经分配好的供程序使用的。

在这里说明一下,本节介绍的堆栈与数据结构中的堆栈无关。

为什么要有堆栈?堆栈是程序执行过程中必须使用的一块内存,任何一个程序需要用到的关键数据、临时数据等,都会在堆栈中一定的体现,我们可以把堆栈看成程序的心脏。

看图2-10-1堆栈窗口中的内存,都是已经向操作系统申请过的。

那么我们怎么知道申请了多少堆栈哪?看图2-10-1寄存器窗口中有FS位,它对应的数据是0x00272000,在DTDebug.exe软件中找到命令窗口,输入dd 0x00272000,如图2-10-2所示:点击键盘上的Enter键,如图2-10-3所示:在内存窗口中,内存地址0x00272004对应的数据是0x001A0000 (Top of thread's stack),内存地址0x00272008对应的数据是0x0019D000 (Bottom of thread's stack)。

这就是操作系统为我们分配的堆栈地址,从0x0019D000到0x001A0000,堆栈窗口中的内存地址就在这个范围的。

不同的系统分配的大小会有差异。

由于堆栈是操作系统专门给程序用的,程序在执行过程中必须使用堆栈,所以它又可以看做是一块特殊的内存。

堆栈窗口中的内存地址是从高内存地址到低内存地址用的,也就是从内存地址0x001A0000开始使用到内存地址0x0019D000结束,如果用完了,就会报错,提示堆栈溢出。

那我们怎么知道当前程序堆栈使用到哪里了?比如图2-10-3汇编窗口中,当前程序停在了0x77068E34,我们看寄存器窗口中,ESP寄存器存储的数据为0x0019FFF0,则0x0019FFF0为当前程序堆栈使用到的地方。

那么从内存地址0x001A0000到内存地址0x0019FFF0都已经被使用过了如图2-10-4所示:为什么是ESP寄存器哪?为什么不是别的寄存器?在之前我们介绍过,32位汇编中8个通用寄存器都有各自的用途,ESP为栈指针,用于指向栈的栈顶,也就是说当前使用到的存储数据的内存地址。

有指向栈顶的指针,肯定有指向栈底的指针,那就是ESB寄存器,ESP 为帧指针,指向当前活动记录的底部。

我们知道了堆栈的知识,那我们该怎么使用堆栈哪?接下来介绍堆栈的使用2.10.2【堆栈的使用】我们当前程序执行到某个阶段时,中间会产生大量的数据,而这些数据将会暂时保存在堆栈中。

如果我们现在要使用堆栈,假如有临时数据0x00000001和临时数据0x00000002,我们怎么能让这些临时数据暂时保存在堆栈中哪?如图2-10-4寄存器窗口中ESP存储的当前数据为0x0019FFF0,说明堆栈已经使用到了内存地址为0x0019FFF0,临时数据只能存储在内存地址0x0019FFEC往上的地方。

知道存储在哪了,接下来就是写汇编指令将临时数据保存在堆栈中了。

我们可以用已经学过的指令:第一步:输入指令,如图2-10-5所示:MOV DWORD PTR DS:[0x0019FFEC],0x00000001MOV DWORD PTR DS:[0x0019FFE8],0x00000002第二步:按F8执行,并观察如图2-10-6、2-10-7所示。

两次按F8执行后,临时数据0x00000001和临时数据0x00000002都已经暂时存储在了堆栈中。

但ESP寄存器存储的数据并没有发生变化,这时我们要告诉堆栈当前已经使用到内存地址为0x0019FFE8的地方,若不告诉堆栈,则下一次再存储数据时可能会覆盖掉之前存储的临时数据,那么该如何告诉堆栈哪?第一步:输入指令,如图2-10-8所示:SUB ESP,4SUB ESP,4因为向堆栈中写入了2次数据且堆栈中的数据是从高地址到低地址,所以将esp的值减少8个字节,也可写成SUB ESP,8。

第二步:按F8执行并观察ESP寄存器存储的数据变化及堆栈窗口的变化,如图2-10-9、2-10-10所示:图2-10-9堆栈窗口中的黑色定位光标显示在了内存地址0x0019FFEC中,而ESP存储的数据为0x0019FFEC,说明堆栈已经记录了数据0x00000001。

我们接着按F8观察。

图2-10-10堆栈窗口中的黑色定位光标显示在了内存地址0x0019FFE8中,而ESP存储的数据为0x0019FFE8,说明堆栈已经记录了数据0x00000002。

我们以后再使用数据时,可以先提升栈顶,再存入数据。

比如再向堆栈中存入临时数据0x33333333,我们先提升栈顶, 在输入数据。

第一步:先提升栈顶,如图2-10-11,ESP存储的数据为0x0019FFE8。

SUB ESP,4第二步:按F8执行并观察数据变化如图2-10-12所示。

图2-10-12堆栈窗口中的黑色定位光标显示在了内存地址0x0019FFE4中,而ESP存储的数据为0x0019FFE4,说明堆栈已经提升了。

第三步:向堆栈中写入数据,如图2-10-13所示,当前ESP存储的数据为0x0019FFE4,内存地址0x0019FFE4存储的数据为0x00000000。

MOV DWORD PTR SS:[ESP],0x33333333第四步:按F8执行并观察数据变化,如图2-10-14。

图2-10-14寄存器窗口中ESP存储的数据为0x0019FFE4,内存地址0x0019FFE4存储的数据为0x33333333。

假如我们存储的临时数据0x00000001、0x00000002和0x33333333,使用后不需要再用,那我们该如何释放被临时数据占用的内存哪?由于我们使用的内存地址总是栈顶指针ESP 的相对位置,所以我们只要修改ESP的值,就可以将这一块内存释放出来供下次使用,所以用完这3个临时数据后,我们恢复原来的堆栈。

第一步:由于是存放了3个临时数据,输入指令,如图2-10-15所示。

ADD ESP,4ADD ESP,4ADD ESP,4或者ADD ESP,0xC图2-10-15中,ESP存储的数据为0x0019FFE4,当前栈顶为内存地址0x0019FFE4。

第二步:按F8单步执行并观察堆栈窗口中黑色光标区域栈顶的变动,如图2-10-16所示。

图2-10-16中,堆栈窗口中的黑色定位光标区域为内存地址0x0019FFF0,寄存器窗口中ESP存储的数据为0x0019FFF0,所以成功恢复到一开始没有存储临时数据的内存地址。

大家肯定看到图2-10-16中我们存储的临时数据还存在,这里我们已经恢复了栈顶,至于之前存储的临时数据对我们来说毫无影响了,下次存储临时数据时可以直接覆盖,对我们调试程序没有影响。

【拓展:我们在使用C语言或其他语言时,为什么要给局部变量赋初始值,原因就在这,如果没有初始化,只是申请变量空间,那么这里面的值就会影响我们的结果。

】以上我们是用基础指令来演示堆栈变化,汇编语言还给我们提供了一些简化指令。

【PUSH指令】PUSH指令它的功能是:1、向堆栈中压入数据2、修改栈顶指针ESP寄存器的值PUSH 指令的格式:PUSH r32PUSH r16PUSH m16PUSH m32PUSH imm我们push立即数的时候,默认为4个字节,这里不能使用8位寄存器或者内存。

例:我们动手做实验,输入以下指令,如图2-10-17所示:PUSH 0x33333333第二步:按F8执行并观察数据变化,如图2-10-18所示。

看图2-10-18寄存器窗口ESP存储的数据为0x0019FFEC,堆栈窗口中黑色定位光标区域为内存地址0x0019FFEC,为当前栈顶,内存地址0x0019FFEC存储的数据正是我们压入的数据0x33333333,所以可以总结出,PUSH 0x33333333这条指令相当于:1、MOV DWORD PTR SS:[ESP],0x333333332、SUB ESP,0x33333333学汇编我们不要记汇编的格式,要真正掌握它的工作原理,当我们能用其他的指令实现相同的功能才能真正学会了汇编。

接下来我们学习另一个堆栈指令,我们记住它的功能,并能用其他指令代替,才能算掌握。

【POP指令】POP指令功能:1、将栈顶数据存储到寄存器/内存2、修改栈顶指针ESP寄存器的值POP指令格式:POP r32POP r16POP m16POP m32POP指令是将栈顶指针指向的数据取出,所以必须要有一个容器去接收POP指令弹出来的值,所以POP 后面不能是立即数例:我们动手做实验,输入以下指令,如图2-10-19所示,当前ESP存储的数据为0x009FFF0,内存地址0x009FFF0存储的数据为0x11111111,也是栈顶:POP ECX第二步:按F8执行后观察数据变化,如图2-10-20所示:看图2-10-20寄存器窗口中,ESP存储的数据为0x0019FFF4,堆栈窗口中黑色定位光标区域为内存地址0x0019FFF4,为当前栈顶,ECX存储的数据正是我们取出的数据0x11111111,所以可以总结出,POP这条指令相当于:1、MOV DWORD PTR SS:[ESP]2、ADD ESP,4总结:PUSH、POP是堆栈相关的指令,PUSH表示将数据压入堆栈中,同时栈顶提升相应宽度的字节,POP表示将栈顶的数据取出来放到某个容器里,同时栈顶减少相应宽度的字节。

练习:1、使用3种方式实现:PUSH ECX2、使用3种方式实现:POP ECX3、使用3种方式实现:PUSH ESP4、使用3种方式实现:POP ESP。

相关文档
最新文档