《汇编语言》学习笔记(清华大学 王爽)
汇编语言第二版(王爽)知识总结

第 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 位除数
汇编语言复习重点(王爽)

汇编语言(教材王爽)期末考试复习:考试题型:选择、填空、程序分析、编程题一、重点复习课本的检测点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. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。
汇编语言王爽第三版检测点答案带目录

汇编语言王爽第三版检测点答案带目录在学习汇编语言的过程中,王爽老师的《汇编语言(第三版)》无疑是一本备受推崇的经典教材。
而对于学习者来说,检测点的答案能够帮助我们更好地巩固知识,查漏补缺。
接下来,我将为大家详细呈现这本教材中各个章节检测点的答案,并附上清晰的目录,方便大家查阅和学习。
第一章基础知识检测点 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 处。
《汇编语言(第4版)》读后感

《汇编语言(第4版)》读后感《汇编语言(第 4 版)》是王爽编著的一本关于汇编语言的教材,这本书的教学重心是通过学习关键指令来深入理解机器的基本原理,培养底层编程意识和思想。
我从事嵌入式软件开发,工作中经常会碰到底层问题,需要分析系统 crash 的原因,因此我希望通过学习汇编语言来拓宽自己的知识面。
在部门技术总监的推荐下,我翻开了这本书,没想到一读就被吸引进去,真是让人欲罢不能的好书!本书前言提到:“本书的教学重心是:通过学习关键指令来深入理解机器的基本原理,培养底层编程意识和思想。
”这句话明确了本书的教学目标,即通过学习关键指令来深入理解机器的基本原理,培养底层编程意识和思想。
这与我的需求不谋而合,因此我决定认真学习这本书,希望能够提高自己的编程能力和解决问题的能力。
本书通过指令,引入寄存器、跳转、中断、栈操作、端口等概念,借助这些概念讲解计算机程序原理。
然后需要自己上机编程,加深对原理的理解。
可以说,本书表面上讲述的是“过时”的 8086 汇编语言,但这只是表象,深入进去,里面都是通用的、可以迁移的内容。
作者在本书中贯彻者“循序渐进”的原则。
为了解决初学者在学习过程中所接触到的每一个知识点都是当前唯一要去理解的东西,本书对教学内容进行了最小化分割,力求使我们在学习过程中所接触到的每一个知识点都是当前唯一要去理解的东西。
这样,知识固然被打散了,但是对于初学者来说,“这同沿着楼梯上高楼一样,迈出的每一步都不高,结果却上了楼顶”。
乍看觉得这很理想主义,但认真学习本书,就知道并非虚言。
循序渐进的原则不仅在本书正文中贯彻,习题也是如此。
作者在前言明确表示,“没有通过检测点不要向下学习”,“没有完成当前的实验不要向下学习”,书中像这样的话也是经常出现:“这个编程任务必须在进行下面的课程之前独立完成,因为后面的课程中,需要通过这个实验而获得的编程经验。
”这说明有的知识点,有的感觉,只通过正文讲解是无法让读者入脑的,必须通过习题,让读者思考,或者上机实验,特别要经历过错误后调试正确,才会悟到一些东西,找到一些感觉。
王爽汇编语言1至7章学习笔记代码

assume cs:code,ds:data,ss:stack stack segmentdw 512 dup (0)stack endscode segmentdw 512 dup (0)data segmentdata endsstart:mov ax,datamov ds,axmov ax,stackmov ss,axmov ax,codemov bx,0mov ax,ss:[bx]code endsend start7-1assume cs:code,ds:datadata segmentdb 'welcome to masm!'db '................'data endscode segmentstart: mov ax,datamov ds,axmov cx,8mov si,0s: mov ax,0[si]mov 16[si],axadd si,2loop smov ax,4c00hint 21hcode endsend start7-6assume cs:code,ds:datadata segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help 'data endscode segmentstart: mov ax,datamov ds,axmov bx,0mov cx,6s: mov al,[bx+4]and al,11011111bmov [bx+4],aladd bx,16loop smov ax,4c00hint 21hcode endsend start7-8assume cs:code,ds:datadata segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help 'data endscode segmentstart: mov ax,datamov ds,axmov bx,0mov cx,6s0: mov dx,cxmov si,4mov cx,7s1: mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop s1mov cx,dxadd bx,16loop s0mov ax,4c00hint 21hcode endsend start7-9assume cs:code,ds:datadata segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help 'dw '0'data endscode segmentstart: mov ax,datamov ds,axmov bx,0mov cx,6s0: mov ds:[40h],cxmov si,4mov cx,7s1: mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop s1mov cx,ds:[40h]add bx,16loop s0mov ax,4c00hint 21hcode endsend start8-1assume cs:code,ds:data, ss:stack data segmentdb 'test............'data endsstack segmentdw 0,0,0,0,0,0,0,0,0stack endscode segmentstart:mov ax,datamov ds,axmov bx,0mov bp,1hmov si,0mov di,0mov ax,[bp]mov ss,[bp]mov ax,4c00hint 21hcode endsend start。
王爽《汇编语言》 1指令系统总结 (2)

• AND指令: 指令: 指令
任一数与1相与,值不变;任一数与 相与结果为 相与结果为0。 任一数与 相与,值不变;任一数与0相与结果为 。 相与 常用于对指定位数置0的操作。 常用于对指定位数置 的操作。 的操作 例: ‘a’ and 11011111 = ‘A’
• OR指令: 指令: 指令
任一数与1相或,值为 ;任一数与0相或其值不变 相或其值不变。 任一数与 相或,值为1;任一数与 相或其值不变。 相或 常用于对指定位数置1的操作 的操作。 常用于对指定位数置 的操作。 例: ‘A’ or 00100000 = ‘a’
• 返回指令 ret 常与CALL配合使用,用于返回主程序。 配合使用, 常与 配合使用 用于返回主程序。 操作:当前堆栈内容出栈给IP或 和 , 操作:当前堆栈内容出栈给 或CS和IP,返回 指令的下一条指令执行。 到CALL指令的下一条指令执行。 指令的下一条指令执行 • 中断指令 int • 中断返回指令 中断返回指令iret
4、转移指令 、
Jmp/jcxz/je/jb/ja/jnb/jna/loop/call/ret/retf/int/iret • 无条件转移指令 无条件转移指令JMP
段内直接转移 例:JMP 标号 段内间接转移 例:JMP CX ;JMP WORD PTR [BX] 段间直接转移 例:JMP FAR PTR 标号 段间间接转移 例:JMP DWORD PTR [BX][DI] 段内转移只修改IP的值 段间转移修改CS和 的值 的值; 的值。 段内转移只修改 的值;段间转移修改 和IP的值。
汇编语言学习笔记
汇编语言学习笔记《汇编语言》--王爽前言学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。
原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。
第一章基础知识有三类指令组成汇编语言:汇编指令;伪指令;其他符号。
8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。
1.1节--1.10节小结(1)汇编指令是机器指令的助记符,同机器指令一一对应。
(2)每一种cpu都有自己的汇编指令集。
(3)cpu可以直接使用的信息在存储器中存放。
(4)在存储器中指令和数据没有任何区别,都是二进制信息。
(5)存储单元从零开始顺序编号。
(6)一个存储单元可以存储8个bit,即八位二进制数。
(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。
也可以说,这些管脚引出总线。
一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。
地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。
监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。
对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。
这个逻辑存储器即是我们所说的内存地址空间。
第二章寄存器(cpu的工作原理)mov ax, 2add ax, axadd ax, axadd ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器;段地址*16+偏移地址= 物理地址的本质含义内存并没有分段,段的划分来自cpu。
X86汇编语言
汇编(破解系列基础)(王爽汇编语言笔记第一版2013-8-1)(王爽汇编语言笔记第二版2013-8-11)笔记目录:第一章:基础知识(机器语言与汇编语言,及8086cpu的地址数据控制总线。
)第二章:寄存器cpu工作原理(寄存器的初步认识,字和字节概念,最主要的是8086cpu物理地址的表达方法,及汇编开始执行代码段。
)第三章:寄存器的内存访问(cpu是如何访问内存的,并附加一些简单的汇编指令,重要的是栈概念的引入。
)第四章:第一个程序(==,主要记录DEBUG是怎么用的......)第五章:[bx]和loop指令(循环的引入,及段前缀的概念。
)第六章:包含多个段的程序(包含多个段使程序使数据代码栈更加清晰)第七章:更灵活的定位内存地址的方法(引进SI DI16寄存器使程序寻址更加方便,模拟高级语言中数组和结构体表达,及and和or指令汇编指令。
)第八章:数据处理的两个基本问题(==)第九章:跳转指令的原理(jmp jcxz各种跳转地址表达方法,及offset操作符。
)第十章:call和ret(最重要,类似高级语言中函数的功能。
)第十一章:标志寄存器(各种”jump”,各种标志位...每次执行后可由标志位判断数据处理情况,破解中尤其重要。
)第一章:基础知识1:【机器语言】(010000001000000)0和1的组成2:【汇编语言】:每条汇编指令对应一条机器语言13BE:0100B80010MOV AX,1000(B8对应AX,0010高低字节对应1000,第十章中有详细的解释)3:【CPU对内存的读写】(8086CPU,X86)CPU到内存3条总线:控制总线地址总线数据总线①地址总线(内存索引):8086CPU一共16条,每条传送0或1。
②数据总线(CPU与外部的传送速度)③控制总线(多少种控制总线是CPU对外界器件有多少种控制,有些命令是几根控制线综合发出的)4:【RAM(随机储存)和ROM(只读储存)】RAM和ROM是内存,硬盘是外存。
王爽汇编笔记
第一章基础知识本章概述: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的管脚连接起来的。
汇编语言(王爽)Word版(1)
汇编语言(王爽)Word版(1)第1章基础知识汇编语言是直接在硬件之上工作的编程语言,我们首先要了解硬件系统的结构,才能有效地应用汇编语言对其编程。
在本章中,我们对硬件系统结构的问题进行一部分的探讨,以使后续的课程可在一个好的基础上进行。
当课程进行到需要补充新的基础知识(关于编程结构或其他的)的时候,再对相关的基础知识进行介绍和探讨。
我们的原则是,以后用到的知识,以后再说。
在汇编课程中我们不对硬件系统进行全面和深入的研究,这不在课程的范围之内。
关于PC机及CPU物理结构和编程结构的全面研究,在《微机原理与接口》中进行;对于计算机一般的结构、功能、性能的研究在一门称为《组成原理》的理论层次更高的课程中进行。
汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活地控制系统进行工作。
1.1 机器语言说到汇编语言的产生,首先要讲一下机器语言。
机器语言是机器指令的集合。
机器指令展开来讲就是一台机器可以正确执行的命令。
电子计算机的机器指令是一列二进制数字。
计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
上面所说的计算机指的是可以执行机器指令,进行运算的机器。
这是早期计算机的概念。
现在,在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。
这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元),CPU是一种微处理器。
以后我们提到的计算机是指由CPU和其他受CPU直接或间接控制的芯片、器件、设备组成的计算机系统,比如我们最常见的PC机。
每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。
所以每一种微处理器都有自己的机器指令集,也就是机器语言。
早期的程序设计均使用机器语言。
程序员们将用0、1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。
应用8086CPU完成运算s=768+12288-1280,机器码如下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
清华大学《汇编语言》(王爽)读书笔记第一章基础知识◎汇编语言由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数据段寄存器。
不能将数据直接送入段寄存器,所以『MOV DS, 1』不正确◎字在存储时要两个连续的内存单元,低位在低地址,高位在高地址◎[address]表示一个偏移地址为address的内存单元◎SS:SP指向栈顶元素◎PUSH AX:(1)SP = SP - 2;(2)AX送入SS:SP◎POP AX:(1)SS:SP送入AX;(2)SP = SP + 2◎PUSH/POP 寄存器PUSH/POP 段寄存器PUSH/POP 内存单元第四章第1个程序◎可执行文件包含两部分:程序和数据,相关的描述信息◎程序加载后, ds中存放这程序所在内存区的段地址,这个内存区的偏移地址为0,策程序所在的内存区的地址为ds:0;这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信。
从256字节处向后的空间存放的是程序。
第五章 [BX]和loop指令◎[BX]表示一个内存单元,它的段地址在ds中,偏移地址在bx中。
MOV AX,[BX] MOV AL,[BX]MOV [BX],AX◎loop要进行两步操作,CX=CX-1;判断cx中值,不为零则转至标号处执行程序,为零则向下执行。
◎masm将指令 mov ax,[0] 当作 mov ax,0 处理解决方法可以为 mov bx,0 使用寄存器mov ax,[bx]或 mov ax,ds:[0] 直接给出段地址所在的段寄存器◎loop中不可使用 mov [cx],cx第六章包含多个段的程序◎dw 定义字型数据◎end 标号定义程序入口点◎定义多个段,同定义代码段相同。
定义仅仅是为了程序阅读方便◎assume cs:code,ds:data,ss:stack是伪指令,将定义的具有一定用途的段和相关的寄存器联系起来◎对于段,如果数据占N个字节,则程序加载后实际占有空间为:(N/16+1)*16,N的16整数第七章更灵活的定位内存地址的方法◎and 按位与 and al, 0EFh◎or 按位或 or al, 20h◎字母大小写转换:大写(xx0x xxxx) and al, 0EFh小写(xx1x xxxx) or al, 20h◎mov ax,[200+bx] == mov ax,[bx+200] == mov ax,200[bx] == mov ax,[bx].200 段地址为ds,偏移地址为bx+200◎si和di示8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用◎一般来说,在需要暂存数据的时候,都应该使用栈第八章数据处理的两个基本问题◎bx,si,di,bp1。
在8086CPU中,只有这4个寄存器可以用在[...]中来进行内存单元的寻址正确:mov ax,[bx] | mov ax,[bp]错误:mov ax,[cx] | mov ax,[dx] | mov ax,[ax] | mov ax,[ds]2。
在[...]中,这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di错误:mov ax,[bx+bp] | mov ax,[si+di]3。
只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中mov ax,[bp] ax=ss*16+bp(取地址值)◎在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度,X在汇编指令中可以位word 或byte:mov word ptr ds:[0],1 | add word ptr [bx],2 | inc byte ptr ds:[2]◎div,除法指令 div 除数除数 8位 16位被除数 AX DX->高16位 AX->低16位商 AL AX余数 AH DX◎dd 伪指令,定义双字dword◎dup 伪指令,用来进行数据的重复db 3 dup (0) == db 0,0,0db 3 dup (0,1,2) == db 0,1,2,0,1,2,0,1,2db 3 dup ('ab','CD') == db 'abCDabCDabCD'第九章转移指令的原理◎可以修改ip,或同时修改cs和ip的指令统称为转移指令◎8086CPU的转移行为有一下几类:只修改ip时,称为段内转移,如jmp ax同时修改cs和ip时,称为段间转移,如jmp es:[dx]由于转移指令对ip的修改范围不同,段内转移又分为:短转移和近转移短转移ip的修改范围为 -128~127近转移ip的修改范围为 -32768~327678086CPU的转移指令分为以下几类:无条件转移指令(如jmp)条件转移指令循环指令(如loop)过程中断◎offset 取得标号的偏移地址◎jmp short 标号实现段内短转移,对ip的修改范围为 -128~127 对应机器码中包含转移的位移 EB 地址◎jmp near ptr 标号实现段内近转移,对ip的修改范围为 -32768~32767 对应机器码包含转移的位移◎jmp far ptr 标号实现段间转移对应机器码中高地址为段地址,低地址为偏移地址 EA偏移地址段地址◎jmp word ptr 内存单元地址(段内转移)◎jmp dword ptr 内存单元地址(段间转移)高地址存放目的段地址,低地址存放目的偏移地址◎jcxz 标号 cx为0时跳转所有有条件跳转指令都是短转移,对ip的修改范围都为 -128~127◎loop 标号所有循环指令都是短转移,对ip修改范围都为 -128~127◎80×25彩色字符显示模式显示缓冲区结构:内存地址空间中,B8000h~BFFFFFh共32KB的空间,为80×25彩色显示缓冲区。
向这个地址写入数据,写入的内容将立即出现在显示器上。
在80×25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性。
一个字符在缓冲区占两个字节,一屏内容共占4000个字节。
显示缓冲区分8页,每页4KB,显示器可以显示任意一页的内容,一般显示第0页,即B8000h~B8F9Fh。
在一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存储字符的属性,一行80字符,占160字节属性字节的格式:7 6 5 4 3 2 1 0BL(闪烁) RGB(背景) I RGB(前景)显示在 M行 N列的字符为 B800:[160*M + 2*N]第十章 call和ret指令◎ret用栈中数据修改ip,实现近转移(ip) = ((ss) * 16 + (sp))(sp) = (sp) + 2相当于:POP ip◎retf用栈中数据修改cs和ip,实现远转移(ip) = ((ss) * 16 + (sp))(sp) = (sp) + 2(cs) = ((ss) * 16 + (sp))(sp) = (sp) + 2相当于:POP ipPOP cs◎call指令,call指令不能实现短转移,实现转移的方法和假名牌指令原理相同1。
call 标号,段内转移机器指令中没有转移的目的地址,而是相对于当前ip的转移位移(补码),相当于 1.push ip 2.jmp near ptr 标号2。
call far ptr 标号,段间转移机器指令中包含转移目的地址,相当于 1.push cs 2.push ip 3.jmp far ptr 标号3。
call 16位寄存器相当于 1.push ip 2.jmp 16位寄存器,机器指令不包含目的地址注意:1.push ip ip先变成call后第一个字节的偏移地址,然后入栈4。
call word ptr 内存地址相当于 1.push ip 2.jmp word ptr 内存地址5。
call dword ptr 内存地址相当于 1.push cs 2.push ip 3.jmp dword ptr 内存地址注意:2.push ip ip先变成call后第一个字节的偏移地址,然后入栈◎mul 指令,乘法 a × ba 8位 16位b AL AX结果 AX 高位DX,低位AX第十一章标志寄存器◎ 11 10 9 8 7 6 4 2 0OF DF IF TF SF ZF AF PF CF◎ZF 零标志位,如果运算结果为零,则 ZF=1◎PF 奇偶标志位,相关指令执行后,1 的个数为偶数 PF=1◎SF 符号标志位,执行后,计算结果为负 SF=1◎CF 进位标志位,无符号加减发生最高有效位之外的进、接位时 CF=1◎OF 溢出标志位,有符号运算发生溢出时 CF=1◎adc 带进位加法,adc ax,bx == (ax)=(ax)+(bx)+CF◎sbb 带借位减法,sbb ax,bx == (ax)=(ax)-(bx)-CF◎cmp 比较指令,相当于减法,但是不保存结果,只影响标志寄存器cmp ax,bx无符号比较时:ax==bx, ZF=1ax<>bx, ZF=0ax< bx, CF=1ax> bx, CF=0 and ZF=0ax<=bx, CF=1 or ZF=1ax>=bx, CF=0有符号比较时(反向说明)cmp ah,bh:SF=0 and OF=0, ah>=bhSF=0 and OF=1, ah< bhSF=1 and OF=0, ah< bhSF=1 and OF=1, ah> bh◎无符号比较跳转指令je, ZF=1jne, ZF=0jb, CF=1jnb, CF=0ja, CF=0 and ZF=0jna, CF=1 or ZF=1◎DF 方向标志位,在串处理指令中,控制每次操作后si di的增减,DF=1 操作后si di递减使用cld,std设置: cld, DF=0. std, DF=1◎movsb 将ds:si内存单元字节送入es:di相当于:mov es:[di], byte ptr ds:[si] ;非8086指令DF=0: inc si, inc diDF=1: dec si, dec di类似的还有movsw,传送一个字一般使用格式为 rep movsb相当于 s:movsb, loop s,所以要在之前设置cx◎pushf 将标志寄存器值入栈, popf 将标志寄存器值出栈◎标志寄存器在debug中的表示0 OV DN NG ZR PE CY1 NV UP PL NZ PO NCOF DF XX SF ZF XX PF CF第十二章内中断◎中断类型码:除法错误:0单步执行:1int0指令:4int n:n◎中断向量表 0000:0000~0000:03E8,1000个单元,N号中断偏移地址为4N,段地址为4N+2,高地址为段地址,低地址为偏移地址◎中断处理过程:1.取得中断类型码 N2.pushf3.TF=0, IF=04.push CS5.push IP6.ip=4N, cs=4N+2◎中断处理程序的编写和子程序类似,常规步骤为:1.保存用到的寄存器2.处理中断3.恢复用到的寄存器4.用iret返回(iret = pop ip, pop cs, popf)第十三章 int指令◎10中断mov ah, 2 ;置光标,2号子例程为设置光标位置mov bh, 0 ;第0页mov dh, 5 ;行号mov dl, 12 ;列号int 10h-----------mov ah, 9 ;9号子例程为在光标位置显示字符mov al, 'a';字符mov bl, 7 ;颜色属性mov bh, 0 ;第0页mov cx, 3 ;字符重复个数int 10h第十四章端口◎端口的读写只能用in(读入)和out(写入)◎在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。