王爽《汇编语言》 第10章 call和ret指令
汇编语言第二版(王爽)知识总结

第 11 章 标志寄存器
48. 8086CPU 的 flag 寄存器的结构:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
11. 8086CPU 采用段地址和偏移地址,通过地址加法器来合成物理地址 物理地址=段地址 x 16 + 偏移地址 (段的大小=偏移地址的长度)
12. 偏移地址 16 位,其变化范围为 0—FFFF H;仅用偏移地址来寻址最多可寻 64KB 个内存 单元;
13. CPU 将 CS:IP 指向的内容作为指令执行,读取一条指令后,IP 值将自动增加,以便使 CPU 读下一条指令,机器码占几个字节,IP 值加几;
mov word ptr ds:【0】,1 表示访问为 1 个字节单元
mov byte ptr ds:【0】,1 表示访问为 2 个字节单元 一般来说,我们可用【bx+idata+si】的方式来访问结构体的数据,用 bx 来定义整个结构
体,用 idata 定位结构体中某一个数据项,用 si 来定义数组中的每个元素;
(1)SP=SP-2,SS:SP 指向当前栈顶前面的单元,以当前栈顶前面的单元作为新的栈顶;
(2)将 AX 中的内容送入 SS:SP 指向的内存单元处,SS:SP 此时指向新栈顶;
20. 8086CPU 入栈时,栈顶从高地址向低地址方向移动,栈为空的时候,SS:SP 指向最底部
的字单元的偏移地址+2;
38. div 指令(除法指令)
8 位除数
汇编语言王爽第三版检测点答案带目录

汇编语言王爽第三版检测点答案带目录在学习汇编语言的过程中,王爽老师的《汇编语言(第三版)》无疑是一本备受推崇的经典教材。
而对于学习者来说,检测点的答案能够帮助我们更好地巩固知识,查漏补缺。
接下来,我将为大家详细呈现这本教材中各个章节检测点的答案,并附上清晰的目录,方便大家查阅和学习。
第一章基础知识检测点 11(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为。
答案:13 位。
因为 8KB = 8×1024 = 2^13B,所以地址总线的宽度为 13 位。
检测点 12(1)8086 CPU 有根数据总线。
答案:16 根。
(2)8086 CPU 有根地址总线。
答案:20 根。
检测点 13(1)内存地址空间的大小受的位数决定。
答案:地址总线。
(2)8086 CPU 的地址总线宽度为 20 位,其可以寻址的内存空间为。
答案:1MB。
因为 2^20 = 1048576B = 1MB。
第二章寄存器检测点 21(1)写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX = 62627mov ah,31H AH = 31H,AX = 31627mov al,23H AL = 23H,AX = 3123H检测点 22(1)给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为到。
答案:00010H 到 1000FH。
(2)有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。
则 SA 应满足的条件是:最小为,最大为。
答案:最小为 1001H,最大为 2000H。
第三章内存访问检测点 31(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据。
完成程序。
assume cs:codesgcodesg segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov bx+16,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start检测点 32(1)下面的程序将“Mov ax,4c00h ”之前的指令复制到内存 0:200 处。
汇编语言(王爽)

六、存储单元
将存储器划分成若干个基本的存储单位, 存储单元 称为存储单元。给每个存储单元从0开始顺序 编号,称为存储单元的地址。 0 1 0 0 1 1 1 0 0
•位(bit):计算机的最小信息单位, 即一位二进制数(0或1) •字节(Byte):1 Byte=8 bit 一个存储单元可以存储一个字节 即8bit的信息。 1KB=1024B 1GB=1024MB 1MB=1024KB 1TB=1024GB
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0
MOV AX,20000
27
16位寄存器分成两个8位寄存器的使用情况
AX寄存器的逻辑结构
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
作业:
18页检测点2.1
(1)、(2)
33
四、物理地址
我们给每个存储单元给了唯一的一个 编号,这个编号就是这个内存单元的物 理地址。在8086/8088CPU中对外有20根 地址线寻址,所以其系统中的内存单元 物理地址为20位的地址编号。
指针寄存器
变址寄存器
源变址 目的变址
25
16位寄存器
• 寄存器组
控制寄存器
IP PSW CS DS SS ES
指令指针 状态标志
代码段
数据段 堆栈段 附加段
段寄存器
提 用寄存器
• 8086CPU的内部寄存器都是16位。 • 将AX、BX、CX、DX 四个寄存器称为通用寄 存器。 MOV AX,18 • 通用寄存器可分为两个独立的8位寄存器来用。 AX寄存器的逻辑结构
汇编语言王爽第二版课后答案

(1) 13⑵ 1024,0,1023(3) 8192,1024(4) 2A 30,2A 20,2A 10(5) 64,1,16,4(6) 1,1,2,2,4(7) 512,256(8) 二进制 注意:1.第4题中的符号'A'指求幂运算(如:2A30指2的 30次方)第二章寄存器(CPU 工作原理)检测点(第18页)检测点(第8页)(1)写岀每条汇编指令执行后相关寄存器中的值。
第一空:F4A3H第二空:31A3H第三空:3123H 第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第 ^一空:D882H第十二空:D888H第十三空:D810H第十四空:6246H(2)只能使用目前学过的汇编指令,最多使用 指令,编程计算2的4次方。
解答如下:mov ax,2add ax,axadd ax,axadd ax,ax检测点(第23页)(1)00010H,1000FH第四空:6246H第2题说明:因为段的起始地址要为16的倍数。
所以当段地址小于1001H或大于2000H时CPL都无法寻到。
检测点(第33页)答:CPU修改了4次IP的值。
情况如下:第1次:执行完mov ax,bx 后第2次:执行完sub ax,ax 后第3次:读入jmp ax后第4次:执行完jmp ax后最后IP的值为0实验1查看CPU和内存,用机器指令和汇编指令编程(第33页)1. 预备知识:Debug的使用<此部分略>2. 实验任务(第43页)(1)<此部分略><此部分略>通过DEBUGS的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005〜ffff:000C(共8个字节单元中)处。
此生产日期不能被改变,因为其具有’只读’属性。
⑷通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输岀到屏幕上。
王爽汇编笔记

第一章基础知识本章概述:1.汇编语言基本上是直接在硬件上工作的编程语言,需要了解硬件系统才能更好的应用汇编编程。
2.最终运行程序的是CPU,我们用汇编语言编程时,必须要从CPU的角度考虑问题。
一、机器语言1.机器语言是机器指令的集合,它是机器可以正确执行的命令,是一列二进制数字。
CPU将之转变为一列高低电平,以便计算机的电子器件受到驱动,进行计算。
2.每一种微处理器,由于硬件设计和内部结构不同,就需要用不同的电平脉冲来控制,使它工作。
所以每一种微处理器都有自己的机器指令集,也就是机器语言。
二、汇编语言的产生1.机器语言使用上的不便造就了汇编语言的产生。
2.汇编语言是机器指令便于记忆的书写格式。
3.汇编语言的编译器把汇编语言编译成机器指令,由计算机最终执行。
三、汇编语言的组成1.汇编指令:机器码的助记符,有对应的机器码,汇编语言的核心,决定汇编语言的特性。
2.伪指令:没有对应的机器码,由编译器执行,计算机不执行。
3.其他符号:如+、—、*、/等,有编译器识别,没有对应的机器码。
四、存储器1.内存是给CPU提供数据和指令的部件,它是程序运行的基本资源。
2.磁盘上的数据和程序需要先读到内存中才可以被CPU使用。
五、指令和数据1.指令和数据是应用上的概念。
2.在内存和磁盘上,指令好数据没有任何区别,都是二进制信息。
3.在CPU运行时才区分数据和信息。
六、存储单元1.存储一个bit信息的硬件存储单位是存储元。
2.一般是8个存储元组成一个存储单元。
3.若干存储单元再组成存储器。
七、CPU对存储器的读写1.存储单元从零开始顺序编号,这些编号可以看作存储单元在存储器中的地址。
2.CPU要访问内存必须先要指定存储单元的地址。
3.在计算系统中一般存储器有很多个,必须指明准确的地址和读写访问的控制信息。
4.总线按逻辑分有:地址总线、控制总线、数据总线。
5.执行顺序:地址信息、控制信息、数据信息。
6.总线直接是和CPU的管脚连接起来的。
汇编语言(王爽)-第二版-课后题全-答案【范本模板】

检测点1.1(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。
(2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 .(3)1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte.(4)1GB是 1073741824 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。
(5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为:64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根.则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。
(7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次. (8)在存储器中,数据和程序以二进制形式存放.解题过程:(1)1KB=1024B,8KB=1024B*8=2^N,N=13。
(2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。
(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit).(4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。
(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N.这样的CPU最多可以寻找2的N次方个内存单元。
(一个内存单元=1Byte).(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
(7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。
汇编语言第十章CALL和RET指令

汇编语⾔第⼗章CALL和RET指令call和ret指令都是转移指令,它们都修改IP,或同时修改IP和CSret和retf:ret指令使⽤栈中数据,修改IP内容,实现近转移。
进⾏两步操作:(1)(IP)= ((ss) * 16 + (sp)) (2) (sp) = (sp) + 2 等价于 pop IP retf指令使⽤栈中数据,修改CS和IP内容,实现远转移。
进⾏四步操作:(1)(IP)= ((ss) * 16 + (sp)) (2) (sp) = (sp) + 2 (3) (CS) = ((ss) * 16 + (sp)) (4)(sp) = (sp) + 2 等价于pop IP pop CScall指令:call指令进⾏两步操作:(1)将当前的IP 或 CS和IP压⼊栈中;(2)转移(IP对应近转移,CS和IP对应远转移)依据位移进⾏的call指令:call 标号进⾏如下操作:(1)(sp)= (sp) - 2 ((ss) * 16 + (sp)) = (IP) (2)(IP) = (IP) + 16位位移等价于 push IP jmp near ptr 标号依据地址进⾏的call指令:call far ptr 标号进⾏如下操作:(1)(sp)= (sp) - 2 ((ss) * 16 + (sp)) = (CS) (sp) = (sp) - 2 ((ss) * 16 + (sp)) = (IP) (2) (CS)的地址 = 标号所在段的段地址;(IP)的地址 = 标号所在段的偏移地址等价于 push CS push IP jmp far ptr 标号call 16 位reg 进⾏如下操作:(sp)= (sp) - 2 ((ss) * 16 + (sp)) = (IP) (IP) = 16位reg等价于 push IP jmp near 16位regcall word ptr 内存单元地址进⾏如下操作:(sp) = (sp) - 2 ((ss) * 16 + (sp)) = (IP) (IP) = (内存单元地址中的内容)等价于push IP jmp word ptr 内存单元地址call dword ptr 内存单元地址进⾏如下操作:(1)(sp)= (sp) - 2 ((ss) * 16 + (sp)) = (CS) (sp) = (sp) - 2 ((ss) * 16 + (sp)) = (IP)(2) (CS)的地址 = 后两字节内容;(IP)的地址 = 前两字节内容等价于push CS push IP jmp dword ptr 内存单元地址⽤call和ret实现调⽤⼦程序:call sub1...(返回处)sub 1 :.....(⼦程序)ret (返回第⼆⾏)mul乘法指令:mul reg 或者 mul 内存单元两个数相乘,位数必须相等,要么都是8位(⼩于255),要么都是16位。
汇编语言笔记 王爽教程

汇编语言笔记王爽教程第一章基础知识1. 汇编指令是机器指令的助记符,同机器指令一一对应。
2. 每一种CPU都有自己的汇编指令集。
汇编语言发展至今,由以下三类指令组成:1汇编指令:机器码的助记符,有对应的机器码;2伪指令:没有对应的机器码,由编译器执行,计算机并不执行;3其他符号:如:+,--,*,/等,由编译器识别,没有对应的机器码。
3. CPU可以直接使用的信息在存储器中存放。
4. 在存储器中指令和数据没有任何区别,都是二进制信息。
5. 存储单元从零开始顺序编号。
6. 一个存储单元可以存储8个bit(用作单位写为“b”),即8位二进制数7. 1B=8b 1KB=1024b 1MB=1024KB 1GB=1024MB 1TB=1024GB8. 每一个CPU芯片都有许多管脚,这些管脚和总线相连,也可以说这些管脚引出总线。
一个CPU可以引出总线的宽度标志了这个CPU的不同方面的性能:V地址总线的宽度决定了CPU的寻址能力;Vv数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;Vvv控制总线的宽度决定了CPU对系统中其他器件的控制能力;9. 在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线相连。
这些器件有:CPU,存储器,外围芯片组,扩展插槽等。
扩展插槽上一般插有RAM内存条和各类接口卡。
10. CPU对外部设备都不能直接控制,直接控制这些设备进行工作的是插在扩展插槽上的接口卡。
扩展插槽通过总线和CPU相连,所以接口卡液通过总线同CPU相连。
即CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。
11. 随机存储器RAM,可读可写,但是必须带电存储,关机后存储的内容丢失;只读存储器ROM,只能读取不能写入,关机后其中的内容不丢失。
存储器从功能和连接上分为:* 随机存储器:用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由装在主板上的RAM和插在扩展插槽上的RAM组成。
最新汇编语言-第二版-王爽-完整答案

第1章基础知识检测点1.1(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。
(2)1KB的存储器有1024个存储单元。
存储单元的编号从0到1023。
(3)1KB的存储器可以存储1024*8个bit,1024个Byte。
(4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。
(n^m的意思是n的m次幂)(5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
(7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
第2章寄存器答案检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3Hmov ah,31H AX=31A3Hmov al,23H AX=3123Hadd ax,ax AX=6246Hmov bx,826CH BX=826CHmov cx,ax CX=6246Hmov ax,bx AX=826CHadd ax,bx AX=04D8Hmov al,bh AX=0482Hmov ah,bl AX=6C82Hadd ah,ah AX=D882Hadd al,6 AX=D888Hadd al,al AX=D810Hmov ax,cx AX=6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。
汇编_10 call 和 ret 指令

10.10 参数和结果传递的问题
我们设计一个子程序,可以根据提供的 N,来计算N的3次方。 这里有两个问题:
• (1)我们将参数N存储在什么地方? • (2)计算得到的数值,我们存储在什么地 方?
10.10 参数和结果传递的问题
很显然,我们可以用寄存器来存储,可以 将参数放到 bx 中 ;因为子程序中要计 算 N×N×N ,可以使用多个 mul 指令, 为了方便,可将结果放到 dx 和 ax中。 子程序
10.11 批量数据的传递
参数较多的情况下,将批量数据放到内 存中,然后将它们所在内存空间的首地 址放在寄存器中,传递给需要的子程序。 对于具有批量数据的返回结果,也可用 同样的方法。
10.11 批量数据的传递
我们看一个例子,设计子程序
• 功能:将一个全是字母的字符串转化为大写。 • 子程序
10.10 参数和结果传递的问题
子程序:
• 说明:计算N的3次方 • 参数: (bx)=N • 结果: (dx:ax)=N∧3
cube:mov ax,bx mul bx mul bx ret
10.10 参数和结果传递的问题
注意,我们在编程的时候要注意良好的 风格,对于程序应有详细的注释。子程 序的注释信息应该包含对子程序的功能、 参数和结果的说明。 因为今天写的子程序,以后可能还会用 到;自己写的子程序,也很可能要给别 人使用,所以一定要有全面的说明。
10.6 转移地址在内存中的call指令
(2) call dword ptr 内存单元地址(示 例)
• 比如,下面的指令: mov sp,10h mov ax,0123h mov ds:[0],ax mov word ptr ds:[2],0 call dword ptr ds:[0] 执行后,(CS)=0,(IP)=0123H, (sp)=0CH
技术面试问题汇总第001篇:猎豹移动反病毒工程师part1

CPU 执行 retf 指令时,相当于进行:
pop IP
pop CS
CPU 执行 call 指令时,进行两步操作: (1)将当前的 IP 或 CS 和 IP 压入栈中; (2)转移。 call 指令不能实现短转移,除此之外,call 指令实现转移的方法和 jmp 指令的原理相同。 (以下内容选自《0day 安全:软件漏洞分析技术 第 2 版》第 2.1.5 节) 函数调用大致包括以下几个步骤。
IF:允许中断标志。当 IF 为 1(EI)时,允许中断;IF 为 0(DI)时关闭中断。
DF:方向标志,在串处理指令中控制处理信息的方向。当 DF 置 1(DN)时每次操作后,
变址寄存器 SI 和 DI 减量,这样就使串处理从高地址向低地址方向处理;当 DF 置 0(UP) 时,则反之。
OF:溢出标志。在运算过程中,若操作数超出了机器能表示的范围则称为溢出,此时 OF 标志位为 1(OV);否则置 0(NV)。
日参加了猎豹移动原金山网络反病毒工程师的电话面试但是很遗憾由于我当时准备不足加上自身水平不够面试官向我提出的很多技术问题我都没能答出来这里面既有基础类的问题也有比较高深的问题结果没能通过那次的面试
我在 2014 年 7 月 1 日参加了猎豹移动(原金山网络)反病毒工程师的电话面试,但是 很遗憾,由于我当时准备不足,加上自身水平不够,面试官向我提出的很多技术问题我都没 能答出来(这里面既有基础类的问题,也有比较高深的问题),结果没能通过那次的面试。 痛定思痛,我认认真真总结出了当时向我提出的所有问题,一共是十多条,我会分为几篇文 章来进行剖析。并且根据问题的难易程度,由浅入深进行排序。参考了大量的相关资料,给 出了业界较为权威的书籍上的答案,可能对于某些问题,会同时摘录几本书的内容,并且给 出知识扩展,以更为全面地看待这个问题。
汇编语言指令

汇编语言(王爽版)用到的伪指令,指令等一寄存器(reg):AX,BX,CX,DX,ah,al,bh,bl,ch,cl,dh,dl,SI,DI,SP,BP,IP。
段寄存器(sreg):CS,SS,DS,ES。
1 CS——代码段寄存器(Code Segment Register),其值为代码段的段值;2 DS——数据段寄存器(Data Segment Register),其值为数据段的段值;3 SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;4 ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;5 BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;6 SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
7 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;8 寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;9 寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;10 寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
11 SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
16位标志寄存器——共用了9个标志位,它们主要用来反映CPU的状态和运算结果的特征。
标志位的分布如下表所示。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF 1、进位标志CF(Carry Flag)主要用来反映运算是否产生进位或借位。
《汇编语言》(王爽)笔记

《汇编语⾔》(王爽)笔记1、有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
2、汇编指令伪指令3、CPU通过总线控制接⼝,接⼝控制设备4、CPU对物理器件的操作,通过控制线发出内存读写命令,把他们都当作内存来对待。
所有的物理存储器被看作⼀个由若⼲存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中张有⼀个地址段,即⼀段地址空间。
CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
5、内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。
6、mov ax,8226mov bx,axadd ax,bxax + bx = 1044CHax = 044CH(最⾼位并不丢弃,只是存不下)7、mov ah,0mov al,C5Hadd al,93Hal + 93H = 158Hax = 0058H(此时al作为⼀个独⽴的8位寄存器来使⽤的,和ah没有关系,CPU在执⾏这条指令是认为ah和al是两个不相关的寄存器。
不要错误的认为,诸如add al,93H的指令产⽣的进位会存储在ah中,add al,93H 进⾏的是8为运算)add ax,93Hax =0158H(如果执⾏add ax,93H ,低8位的进位会存储在ah中,CPU在执⾏这条指令时认为只有⼀个16位寄存器ax,进⾏的是16位运算。
)8、在8086PC机中,存储单元的地址⽤两个元素来描述,即段地址和偏移地址段地址*16 + 偏移地址 = 物理地址⼀个段的起始地址⼀定是16的倍数,⼀个段的长度最⼤为64KB9、 4个段寄存器:cs、ds、ss、es10、CS、IP是8086CPU中两个最关键的寄存器,它们指⽰了CPU当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器。
在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取⼀条指令并执⾏。
《汇编语言》学习笔记(清华大学王爽)

《汇编语言》学习笔记(清华大学王爽)清华大学《汇编语言》(王爽)读书笔记第一章基础知识◎汇编语言由3类指令组成汇编指令:机器码的助记符,有对应机器码。
伪指令:没有对应机器码,由编译器执行,计算机并不执行其他符号:如+-*/,由编译器识别,没有对应机器码◎一个CPU有n根地址线,则可以所这个CPU的地址线宽度为n,这样的CPU最多可以寻找2的n 次方个内存单元。
◎ 1K=2^10B 1M=2^20B 1G=2^30B◎8086 CPU地址总线宽度为20,寻址范围为00000~FFFFF00000~9FFFF 主存储器地址空间(RAM)A0000~BFFFF 显存地址空间C0000~FFFFF 各类ROM地址空间第二章寄存器(CPU工作原理)◎16位结构描述了一个CPU具有下面几个方面的结构特性运算器一次最多可以处理16位的数据寄存器的最大宽度为16位寄存器和运算器之间的通路为16位◎8086有20位地址总线,可以传送20位地址,达到1M的寻址能力。
采用在内部用两个16位地址合成的方法来形成一个20位的物理地址◎物理地址 = 段地址× 16 + 偏移地址◎在编程是可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址位16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB◎8086有四个段寄存器 CS、DS、SS、ES◎CS为代码段寄存器,IP为指令指针寄存器。
任意时刻,设CS中内容为M、IP中内容为N,8086CPU从内存M×16+N读取一条指令执行◎不能用mov修改CS、IP,因为8086CPU没有提供这样功能,可用指令JMP 段地址:偏移地址。
JMP 2AE3:3 JMP AX 修改IP 第三章寄存器(内存访问)◎DS数据段寄存器。
《汇编语言》王爽第10章call和ret指令

本课件由汇编网()制作提供
10.5 转移地址在寄存器中的 call指令
指令格式:call 16位寄存器
汇编语法解释此种格式的 call 指令, CPU执行call 16位reg时,相当于进行:
push IP jmp 16位寄存器
本课件由汇编网()制作提供
引言
call和ret 指令都是转移指令,它们都 修改IP,或同时修改CS和IP。 它们经常被共同用来实现自程序的设 计。 这一章,我们讲解call和ret 指令的原 理。
本课件由汇编网()制作提供
10.1 ret 和 retf
ret指令用栈中的数据,修改IP的内容, 从而实现近转移;
本课件由汇编网()制作提供
10.4 转移的目的地址在指令中 的call指令
从上面的描述中可以看出,如果我们 用汇编语法来解释此种格式的 call 指 令,则: CPU 执行指令 “call far ptr 标号” 时,相当于进行:
push CS
push IP jmp far ptr 标号
问题10.1
本课件由汇编网()制作提供
10.7 call 和 ret 的配合使用
assume cs:code 问题10.1 code segment 右面程序返回前, start: mov ax,1 bx中的值是多少? mov cx,3 call s mov bx,ax ;(bx) = ? mov ax,4c00h int 21h 思考后看分析。 s: add ax,ax loop s ret code ends end start
pop IP pop CS
本课件由汇编网()制作提供
汇编语言王爽

03信管
主讲:王咏宁
1
目录
• 第1章 • 第2章 • 第3章 • 第4章 • 第5章 • 第6章 • 第7章 • 第8章
基础知识 寄存器(CPU工作原理) 寄存器(内存访问) 第1个程序 [bx]和loop指令 包含多个段的程序 更灵活的定位内存地址的方法 数据处理的两个基本问题
2
• 第9章 转移指令的原理 • 第10章 call和ret指令 • 第11章 标志寄存器 • 第12章 内中断 • 第13章 int指令 • 第14章 端口 • 第15章 外中断 • 第16章 直接定址表
• 装有BIOS的只读存储器(ROM) • 接口卡上的RAM
十五、内存地址空间
CPU在控制各类存储器时,把它们都当作内存来 对待,把它们总的看作一个由若干存储单元组 成的逻辑存储器,这个逻辑存储器就是我们这 里所说的内存地址空间。
22
第二章 寄存器(CPU工作原理)
运算器 信息处理
CPU 控制器 控制各种器件进行工作
127
14
七、CPU对存储器的读写
• CPU可以从存储器中取出数据进行处理(读) • CPU将处理后的数据放到存储器中保存(写)
思考: • CPU如何选择要读/写的对象(寄存器、ROM、
RAM、接口) • CPU如何找到要处理的数据。
15
• CPU传送的三种信息
存储单元的地址
(地址信息)
选择芯片、读或写的命令 (控制信息)
寄存器 信息存储
总线
内部总线 连接CPU内部各器件的总线 外部总线 连接CPU与外部各器件的总线
23
8088/86微处理器的内部结构
执行部分EU
返24回
总线接口部分BIU
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
源程序 Assume cs:code Stack segment db 8 dup (0) db 8 dup (0) Stack ends Code segment Start: mov ax,stack mov ss,ax mov sp,16 mov ax,1000 call s mov ax,4c00h int 21h S: add ax,ax ret Code ends End start
3、转移地址在寄存器中的call指令 、转移地址在寄存器中的 指令 格式: 位的寄存器) 格式: call reg(16位的寄存器) 位的寄存器 功能: 将当前IP压栈 用寄存器中的值修改IP 压栈, 功能: 将当前 压栈,用寄存器中的值修改
实现近转移。 实现近转移。 例10-4 下面的程序执行后,AX中的数值为多少? 下面的程序执行后, 中的数值为多少? 中的数值为多少
jmp 指令 标号 二、call指令
执行call指令的功能相当于: 指令的功能相当于: 执行 jmp far ptr 标号 指令的功能相当于 1、push ip或push cs、push ip; 、 jmp 或 、 ; reg 2、修改当前 或ip和cs指向目的地址。 指向目的地址。 、修改当前ip或 dword) ptr [内存 jmp word( 和 指向目的地址 内存] ( ) 内存 Call指令的主要格式: 指令的主要格式: 指令的主要格式
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 I
P 00
下面的程序执行后, 中的数值为多少? 例10-5 下面的程序执行后,ax 和 bx 中的数值为多少?
ss:0
00 19 00 00 00 C S 00 00 00 00 00 00 00 00 00 18 00 00 00 C 00 00 S
S:POP AX :
2、转移的目的地址在指令中的call指令 、转移的目的地址在指令中的 指令 格式: 格式: call far ptr 标号 功能: 将当前CS、 压栈 压栈, 功能: 将当前 、IP压栈,用标号所在地址修
实现远转移。 改CS和IP实现远转移。 和 实现远转移 下面的程序执行后, 中的数值为多少 中的数值为多少? 例10-3 下面的程序执行后,AX中的数值为多少?
•根据位移转移 •转移的目的地址在指令中 转移的目的地址在指令中 •转移地址在寄存器中 转移地址在寄存器中 •转移地址在内存中 转移地址在内存中
1、依据位移进行转移的call指令 、依据位移进行转移的 指令 格式: 格式: call 标号 功能:将当前IP压栈 压栈, 功能:将当前 压栈,IP=IP+16位的位移 位的位移 转移到标号处执行。 量,转移到标号处执行。
例10-2 下面的程序执行后,AX中的数值为多少? 下面的程序执行后, 中的数值为多少 中的数值为多少?
内存地址 1000:0 : 1000:3 : 1000:6 : 1000:7 : 机器码 B8 00 00 E8 01 00 40 58 汇编指令 MOV AX,0 , CALL S INC AX
二、call指令 指令
执行call指令的功能相当于: 指令的功能相当于: 执行 指令的功能相当于 1、push ip或push cs、push ip; 、 或 、 ; 2、修改当前 或ip和cs指向目的地址。 指向目的地址。 、修改当前ip或 和 指向目的地址 Call指令的主要格式: 指令的主要格式: 指令的主要格式
补全程序, 处开始执行指令。 例10-1.补全程序,实现从内存 补全程序 实现从内存1000:0处开始执行指令。 : 处开始执行指令 assume cs:code 返回指令ret和retf 一、返回指令 segment 和 stack 格式: 格式:ret db实现近转移,相当于 ;实现近转移,相当于pop ip 16 dup(0) ends 格式:retf; 实现远转移,相当于pop ip ,pop cs 格式: stack实现远转移,相当于 ; code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax, ret和retf指令执行时,将当前堆栈内 指令执行时, 和 指令执行时 push ax ip 或 ip和 , 容分别出栈给 mov ax, 和cs,以实现指令 push 的近或远转移。 的近或远转移。 ax retf code ends end start
内存中的情况(设程序从 处装入) 内存中的情况(设程序从1000:0处装入) : 处装入
1000:0000 1000:0008
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1001:0000 1001:0003 1001:0005 1001:0008 1001:000B 1001:000E 1001:0011 1001:0013 1001:0015
问题10-1 问题 下面程序返回前,BX中的值为多少? 下面程序返回前, 中的值为多少? 中的值为多少 assume cs:code code segment start: mov ax,1 mov cx,3 call s mov bx,ax mov ax,4c00h int 21h s: add ax,ax loop s ret code ends end start
第10章 call和ret指令 章 和 指令
• • • • • ret和 retf 指令 和 call指令 指令 ret和call指令配合完成子程序调用 和 指令配合完成子程序调用 mul乘法指令 乘法指令 模块化程序设计
assume cs:code assume cs:code stack segment stack 返回指令 segment 一、返回指令ret和retf 和 db 16 dup(0) db 16 dup(0) 格式: 格式 ends 实现近转移,相当于pop stack stack :ret ;实现近转移,相当于ends ip code segment 格式: 格式 segment 实现远转移,相当于pop ip ,pop cs ; code :retf; 实现远转移,相当于 mov ax,4c00h mov ax,4c00h int 21h int 21h start: mov ax,stack start: mov ax,stack mov ss,ax mov ss,ax mov sp,16 mov sp,16 mov ax,0 mov ax,0 push cs push ax push ax mov bx,0 mov bx,0 ret retf code ends code ends end start end start
内存地址 1000:0 : 1000:3 : 1000:8 : 1000:9 : 机器码 B8 00 00 9A 09 00 00 10 40 58 汇编指令 MOV AX,0 , CALL FAR PTR S INC AX S:POP AX : ADD AX,AX , POP BX ADD AX,BX ,
• 两个相乘的数位数相同,8位乘法(乘数和被乘数都为 位乘法( 两个相乘的数位数相同, 位乘法 乘数和被乘数都为8 Mov ax,100 位数); 位乘法(乘数和被乘数都为16位 );16位乘法 位数); 位乘法(乘数和被乘数都为 位。) Mov bx,10000 • 8位乘法中,一个乘数默认在 中,另一个由指令给出, 位乘法中, 位乘法中 一个乘数默认在AL中 另一个由指令给出, Mul bx 16位的结果默认保存在 中。 例:计算 位的结果默认保存在AX中 位的结果默认保存在 计算100×10 × • 16位乘法中,一个乘数默认在AX中,另一个由指令给出, 位乘法中,一个乘数默认在 中 另一个由指令给出, 位乘法中 Mov al,100 32位的结果中高位保存在 中,低位在 中。 位的结果中高位保存在DX中 低位在AX中 位的结果中高位保存在 Mov bl,10 Mul bl
assume cs:code :0001 4、转移地址在内存中的call指令 指令 stack 、转移地址在内存中的 segment :0002 dw 8 :0003 格式:dup(0) call 内存单元] 格式:ends word (dword) ptr [内存单元 内存单元 stack :0004 code 功能: 将当前 将当前IP或 、 压栈 压栈, 功能:segment 或IP、CS压栈,用内存单元中 :0005 start: 的字或双字修改 或IP和CS。 mov ax,data 的字或双字修改IP或 和 。 :0006 mov ss,ax :0007 mov sp,16 :0008 mov word ptr ss:[0] , offset s :0009 mov ss:[2] , cs call dword ptr ss:[0] :000A nop :000B s: mov ax,offset s :000C sp sub ax, ss:[0ch] :000D AX=0001h mov bx,cs :000E sp BX=0000h sub bx,ss:[0eh] :000F code ends :0010 sp end start
•根据位移转移 根据位移转移
Call 标号 Call reg(16位) 位 Call word(dword) ptr [内存 内存] 内存
•转移的目的地址在指令中 Call far ptr 标号 转移的目的地址在指令中 •转移地址在寄存器中 转移地址在寄存器中 •转移地址在内存中 转移地址在内存中
配合使用( 三、call和ret配合使用(实现子程序调用) 和 配合使用 实现子程序调用)
B8 00 8E D0 BC 10 B8 E8 E8 05 B8 00 CD 21 03 C0 C3
序: 和 实现子程序 实现子程序: 使用 • 子程序的格式框架: 子程序的格式框架: