《汇编语言》学习笔记(清华大学 王爽)
汇编语言第二版(王爽)知识总结
第 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章基础知识检测点1.1(1) 1个的寻址能力为8,那么它的地址总线的宽度为13。
(2) 1的存储器有1024个存储单元。
存储单元的编号从0到1023。
⑶1的存储器可以存储1024*8个,1024个。
(4) 1、1、1分别是2八30、2八20、2A10。
(n A m的意思是n的m次幕)(5) 8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64()、1()、16()、4()。
⑹8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32 根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
⑺从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
,62627 4A3H,31H 31A3H,23H 3123H6246H,826 8266246H82604D8H0482H6C82H882H,6 888H810H6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方解:,2检测点2.2(1)给定段地址为0001H,仅通过变化偏移地址寻址,的寻址范围为00010H到1000(2)有一数据存放在内存20000H单元中,先给定段地址为,若想用偏移地址寻到此单元则应满足的条件是:最小为1001H,最大为2000H检测点2.3下面的3条指令执行后,几次修改?都是在什么时候?最后中的值是多少?解:修改4次;第一次在读取“ ”后,第二次在读取“ ”后,第三次在读取“ ”后,第四次在执行完“ ”后;最后中的值为0。
实验1查看和内存,用机器指令和汇编指令编程1. 略2.(1) 略⑵略(3) 查看内存中的内容。
汇编语言王爽课后答案
汇编语言王爽课后答案【篇一:汇编语言课后习题答案王爽主编】一个值为 0 的字节,找到后,将它的偏移地址存储在assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0 mov cl,[bx] jcxz ok;当cx=0 okinc bxjmp short sok: mov dx,bxmov ax ,4c00hint 21hcode endsend start dx 中。
时, cs:ip 指向检测点 9.3补全编程,利用loop 指令,实现在内存2000h 段中查找第一个值为 0 的字节,找到后,将它的偏移地址存储在dx 中。
assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s:mov cl,[bx]mov ch,0 inc cxinc bxloop sok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start书 p101 ,执行 loop s 时,首先要将 (cx) 减 1。
“loop 标号”相当于dec cxif((cx) ≠0) jmp short标号检测点 10.1补全程序,实现从内存1000 : 0000 处开始执行指令。
assume cs:codestack segmentdb 16 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax, 1000hmov ax,0push axretfcode endsend start执行 reft 指令时,相当于进行:pop ippop cscs 入栈,再将偏移地址ip 入根据栈先进后出原则,应先将段地址栈。
检测点 10.3下面的程序执行后,ax 中的数值为多少?内存地址机器码汇编指令执行后情况1000:0 b8 00 00 mov ax,0 ax=0,ip 指向 1000:31000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip 指向1000:91000:8 40 inc ax1000:9 58 s:pop ax ax=8hadd ax,ax ax=10hpop bx bx=1000hadd ax,bx ax=1010h用debug 进行跟踪确认,“call far ptr s 是先”将该指令后的第一个字节段地址cs=1000h 入栈,再将偏移地址ip=8h 入栈,最后转到标号处执行指令。
《汇编语言》王爽版 学习笔记(精辟的第十一章总结完毕)
《汇编语言》王爽版学习笔记(精辟的第十一章总结完毕)Nisy总坛主UID2198精华69威望8662在线时间2615 小时最后登录2010-12-10《汇编语言》王爽版学习笔记(精辟的第十一章总结完毕)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&前言:汇编语言,这个东西我是自学的,所以理解上也是很皮毛,这里简单写下读书写得,文中如有出错之处,还望多多指正。
我把这本书分成两部分:前11章为第一部分。
后几章涉及到中断等16位操作系统的知识,这儿就不写了,我们只关心前一部分。
汇编语言。
我是这样理解的:首先他是一套指令集,学习ASM可以站到一个“如何设计处理器、代码如何执行的角度”来看待这套指令集,或者说我们如何通过学习汇编语言来构建一个数据自己涉及的虚拟机平台;期中包括了寄存器的设置、如何将程序模块化==>堆栈思想的引用等等。
程序,就是内存中的一段数据我们可以将其当做代码也可以当做数据也可以作堆栈来使用所以内存的这些数据如何使用决定权在我们如何去定义我们如何让内存的数据与处理器产生联系并去实现程序员的目的作为要写一本教程,首先要考虑如何将知识讲授给对方。
这就是一个将知识系统化并条理化展开的一个过程。
前言上有两句话:一个是循序渐进后边的知识后边再讲。
这句话很厉害这个思想代表了作者的逻辑,第二句话是编程的平台不是操作系统而是硬件。
《汇编语言》(王爽)第3章 寄存器(内存访问)--笔记
举例:我们要存储一个字4E20H(1)在内存单元是这样的:CPU 中,用16位寄存器来存储一个字,这个字的低位字节放在低地址单元中,高位字节存放在高地址单元中。
1.我们将起始地址为N 的字单元简称为N 地址字单元。
比如上面那个例子,字4E20H 的起始地址是0,所以我们就叫0地址字单元。
(以低地址单元的编号作为N )2.当然我们也可以说“0地址单元中存放的字节型数据为20H ”或者“0地址字单元中存放的字型数据为4E20H ”3.3.1 内存中字的存储在默认情况下,8086CPU 取DS 中的数据作为内存单元的段地址,其偏移地址用“[...]"表示1.错误示范:(1)mov ds,1000H正确示范:(用BX 作为中转寄存器)(2)MOV BX,1000H MOV DS, BX归纳:8086CPU 不支持直接将数据送入段寄存器,只能通过其他通用寄存器作为中转,原因和其硬件设计有关,我们不需要深究。
举例:不能直接把1000H 给段寄存器2.3.2 DS 和[address]8086CPU 是16位结构,有16根数据线,所以一次可以传送16位的数据,也就是一次可以传送一个字。
1.举例:(1)mov bx,[2](ds:1000)实际上读的是1000:0001(低八位)和1000:0002(高八位)两个字节的数据读字单元是读“[...]"所指向的内存单元以及下一个内存单元,其中指向的那个单元是低八位。
2.比如:mov ax ,11316 →mov ax ,2C34H(1)其他注意:在分析mov ax,idata 这类指令的时候,最好先把idata 转化为十六进制,便于后面的分析。
3.举例:(第7章笔记中有写过)(1)补充其他(内存和寄存器之间字单元的传送):在内存和寄存器之间传送数字型数据的时候,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
4.3.3 字的传送MOV 寄存器,数据 比如:MOV AX,8(1)MOV 寄存器,寄存器 比如:MOV AX,BX(2)MOV 寄存器,内存单元 比如:MOV AX,[0](3)MOV 内存单元,寄存器 比如:MOV [0],AX(4)MOV 段寄存器,寄存器 比如:MOV DS,AX(5)MOV 寄存器,段寄存器 比如:MOV AX,DS(6)MOV 内存单元,寄存器 比如:MOV [0],CS(7)MOV 段寄存器,内存单元 比如:MOV DS,[0](8)MOV 指令1.ADD 寄存器,数据(1)ADD 寄存器,寄存器(2)ADD 寄存器,内存单元(3)ADD 内存单元,寄存器(4)ADD 指令2.SUB 寄存器,数据(1)SUB 寄存器,寄存器(2)SUB 寄存器,内存单元(3)SUB 内存单元,寄存器(4)SUB 指令3.ADD 和SUB 都不能对段寄存器操作•3.4 MOV 、ADD 、SUB 指令其中4E 是该字的高八位存在了高地址单元中,而其低八位20H 存在了低地址单元中。
汇编语言笔记 王爽教程
汇编语言笔记王爽教程第一章基础知识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组成。
学_汇编语言_王爽版要点采集笔记(未完待续...)
学_汇编语⾔_王爽版要点采集笔记(未完待续...)第⼀章基础知识存储器(内存)存放CPU⼯作的指令和数据(CPU可以直接使⽤的信息在内存中存放);指令和数据都是⼆进制数没有任何区别,由CPU决定是数据还是指令内存单元:存储器被分为若⼲个存储单元,并从0开始编号(存储单元的地址),⼀个存储单元为1字节(8bit)CPU的读写总线逻辑上分为:地址总线、数据总线、控制总线地址总线:地址线宽度决定了CPU的寻址能⼒,计算⽅式:2^[地址线宽](个内存单元)数据总线:决定了CPU和外界的数据传输速度(8根数据总线可传送⼀个8位(bit)⼆进制数,即1个字节)控制总线:是各外部器件的不同控制线的集合CPU进⾏数据读写必须经过3类信息交互:①存储单元的地址(地址信息)②器件的选择,读或写的命令(控制信息)③读或写的数据(数据信息)读:CPU在内存中读取数据时,要先指定存储单元的地址(你要找⼀个地⽅先要确定⼀个地址),会把要读取的地址经过地址总线发给内存;同时CPU控制器将内存读命令通过控制总线发送给内存,并通知内存要读取数据;最后内存将被指定的内存单元中的数据经过数据总线送⼊CPU写:与读类似,CPU经地址线发送要操作的内存单元的地址,CPU经控制线将内存写命令发送⾄内存,并通知内存要写⼊数据;CPU通过数据线将数据送⼊指定的内存单元;内存地址空间:每⼀个外部器件都有⾃⼰的存储芯⽚(如显卡有显存RAM和ROM(装有显卡BIOS)、⽹卡ROM(装有⽹卡BIOS)),CPU控制各个设备都是通过总线向各个设备的存储芯⽚发送命令,存储芯⽚根据CPU的命令控制外设进⾏⼯作所有的物理存储器被看作⼀个由若⼲存储单元组成的逻辑存储器,每个物理内存在这个逻辑内存中占有⼀个地址段,即⼀段地址空间可看出各存储芯⽚都和CPU的总线相连;CPU对它们的读写都通过控制线发出内存读写命令CPU根据读取不同的地址实现对不同设备的读写操作,这个逻辑存储器就是内存地址空间,它的容量受CPU寻址能⼒的限制(即地址总线宽度限制),如有20位的地址总线宽度,它的寻址能⼒为2^20个内存单元(⼀个存储单元为1字节(8位))所以该CPU的内存地址空间的⼤⼩为1MB;32位地址线宽的CPU内存地址空间最⼤为为4GB(CPU不⾏的话加内存条也没得⽤!64位的就不得了了,主板不够插)1、CPU寻址能⼒ = 2^线宽2、⼀根数据总线传⼀位数据,8根数据总线⼀次传8位数据(1Byte)第⼆章寄存器CPU组成:运算器(信息处理)、控制器(控制各种器件进⾏⼯作)、寄存器(信息存储)内部总线实现CPU内部器件的联系外部总线实现CPU与主板和其他器件的联系AX、BX、CX、DX通常⽤来存放⼀般性数据——通⽤寄存器(后⾯是X的寄存器是16位的,现在的EAX前⾯加了个E是32位)这四个寄存器都可以分为两个独⽴的⼋位寄存器使⽤(如AX可分为⾼位AH和低位AL),是为了向下兼容(只使⽤低位,⾼位填0)单独使⽤时当成⼀个来看,同时使⽤时是整体(计算⽅法 2^[位数] )⼀个字=两个字节=>⼀个⼗六进制数,所以⼗六进制数的⼀位相当于⼆进制数的四位汇编指令不分⼤⼩写16位结构的CPU具备以下特征(64位同理):1、运算器⼀次最多可以处理16位的数据;2、寄存器的最⼤宽度为16位;3、寄存器和运算器之间的通路是16位的;8086CPU给出物理地址的⽅法:8086有20位地址总线,可传送20位地址,寻址能⼒为2^20 = 1M,⽽8086内部为16位结构,他只能传送16位的地址,表现出的寻址能⼒只有64,说明CPU不能直接传送16位数据地址到20位的总线上(资源浪费),所以需要转换成20位的地址;8086采⽤⼀种在内部⽤两个16位地址合成的⽅法来形成⼀个20位的物理地址(段地址和偏移地址),经过地址加法器转换成20位的物理地址,⽰意图:地址加法器的⼯作原理:物理地址 = 段地址SA*16+偏移地址EA & 物理地址 = 基础地址 + 偏移地址相当于把段地址往⾼位进了⼀位,这⾥说的16位是⼆进制的数,CPU中存储的数据只能是⼆进制,⽽我们表⽰地址是⽤16位的数字,前⾯说了2和16进制的转换关系,⼀个⼗六进制数的位等于四个位的⼆进制数,所以段地址乘以16,把段地址后移了⼀位,增加了⼀位16进制数,⼆进制就得加四位,即数据左移四位(⼆进制位),16+4=20位,转换完成⼀个数据的X进制形式左移1位,相当于乘以X(⼗进制数乘⼗后左移⼀位)⼀个数据的⼆进制形式左移N位,相当于该数据乘以2的N次⽅段落的概念:内存本⾝并没有被分段,分段概念来⾃于CPU,8086CPU⽤物理地址 = 段地址*16+偏移地址的⽅式给出内存单元的物理地址,使得我们可以⽤分段的⽅式来管理内存⽤段地址x16 定位段的起始地址,⽤偏移地址定位段中的内存单元注意:1、段地址X16必然是16的倍数,即⼀个段的起始地址也⼀定是16的倍数2、偏移地址为16位,16位地址的寻址能⼒为64k,所以⼀个段的长度最⼤为64kCPU访问内存单元时必须向内存提供内存单元的物理地址(有地址才知道要访问哪⾥)CPU可以⽤不同的段地址和偏移地址形成同⼀个物理地址(段地址+偏移地址都等于物理地址)偏移地址EA为16位,变化范围0~FFFFH,仅⽤偏移地址来寻址最多可寻64k个内存单元(如段地址位1000H,那么CPU寻址范围为:10000H~1FFFFH储存单元的地址⽤段地址和偏移地址描述:数据在21F60中 a、数据存在内存2000:1F60单元中;b、数据存在内存的2000段中的1F60中;(可将地址连续、起始地址为16的倍数的⼀组内存单元定义为⼀个段)段寄存器:提供段地址,8086CPU有4个段寄存器:CS(代码(指令)段寄存器)、DS(数据段寄存器)、SS(堆栈stack段寄存器)、ES(附加段寄存器)CS和IP(指令指针寄存器)是8086CPU中最关键的寄存器,存放CPU当前要读取的指令的地址在任何时候,CPU将CS为指定(存放)指令的段地址(代码段⾸地址),IP指定(存放)指令的偏移地址(指令从哪处代码开始执⾏),CS和IP经过地址加法器加⼯后(通过输⼊输出控制电路)从地址总线指向内存单元读取指令,指令再通过数据总线(经过输⼊输出控制电路)传递给指令缓冲器,再到执⾏控制器,实现执⾏效果内存中被CPU执⾏过的代码必然被CS:IP指向过1. 从 CS : IP 指向内存单元读取指令,读取的指令进⼊指令缓冲器2. IP = IP + 所读取指令的长度,从⽽指向下⼀条(即所指向的指令执⾏完后接着运⾏接着的下⼀条指令)CPU加电启动或复位时,CS=FFFFH,IP=0000H,即CPU刚启动时读取并执⾏的第⼀条指令是FFFF0H修改CS、IP值的指令:转移指令 jmp1. 同时修改CS、IP的内容:jmp 段地址:偏移地址(例:jmp 2AE3:3)2. 只修改IP的内容:jmp 某⼀合法寄存器(jmp ax),⽤寄存器中的值修改IP代码段:根据需要,将⼀组内存单元定义为⼀个段:把长度<=64kb的⼀组代码存在⼀组地址连续、起始地址为16的倍数的内存单元中(个⼈理解为偏移地址需要16位的位置),这段内存⽤来存放代码,从⽽定义了⼀个代码段(代码段不能影响CPU来是否执⾏它,还是得看CS:IP所指向的内存单元中的内容为指令,代码段仅仅是⼀种编程格式)所以要将CS:IP指向所定义的代码段中的第⼀条指令的⾸地址debug命令:R 查看、改变CPU寄存器的内容(修改寄存器中的值:r [寄存器名])D 查看内存中的内容( d 段地址:偏移地址)E 改写内存中的内容U 将内存中的及其指令翻译成汇编指令T 执⾏⼀条机器指令A 以汇编指令的格式在内存中写⼊⼀条机器指令第三章寄存器(内存访问)字单元:存放字型数据的内存单元⼀个字等于两个字节,⼀个字节等于8⽐特,则⼀个字型数据有16位;因为有两个字节组成,字可分为⾼位和低位,图中0和1可组成⼀个字,1位⽐0位⾼,所以他们组成的字,⾼位是4E,低位是20即4E20(可以直接⽤字的起始地址描述它,如0地址字单元)任何两个地址连续的内存单元,可以将其看成⼀个内存字单元,⼀个为字低位字节单元,⼀个为字⾼位字节单元DS寄存器和 [address]DS寄存器:⽤来存放要要访问数据的段地址(⾸地址),配合 [ EA ] 使⽤,[ ] 说明操作的是⼀个内存单元,EA为偏移地址,段地址为DS中存放的地址数据段:将⼀组长度⼩于64k、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从⽽定义了⼀个数据段;具体操作时⽤ds存放数据段的段地址,在根据需要⽤相关指令访问数据段中的具体单元栈(stack):出⼊栈规则LIFO(后进先出)⼊栈:push 出栈:poppush 寄存器 pop 寄存器push 段寄存器 pop 段寄存器push 内存单元 pop 内存单元内存空间是如何被当做栈使⽤的:每执⾏⼀次⼊栈指令,都会将寄存器的内容放⼊栈顶单元的上⽅,此时段寄存器SS、寄存器SP就会存放栈顶的地址及偏移量,任何时候SS:SP都指向栈顶元素,执⾏push和pop时,CPU从SS和SP中获取段顶地址⼊栈时:SP=SP-2 (⼊栈时由⾼位往低位⾛)出栈时:SP=SP+2 (出栈时由低位往⾼位⾛)注意:⼊栈时的偏移量SP的取值要⽐当前栈最⾼位+1位(如要⼊栈⾄1000E~F(即栈最底部的字单元地址000E),SP值应⽐F⾼⼀位0010栈顶越界:需⾃⾏根据所安排的栈⼤⼩进⾏出⼊栈,避免⼊栈数据太多越界,也要避免空栈的时候继续出栈导致越界;越界会覆盖或修改掉可能是其他程序的内存数据或指令,需要注意!push执⾏时,CPU改变栈顶的指向,即SP=SP-2,再将数据传⼊SS:SP指向的字单元中;pop执⾏时,CPU先读取栈顶指向的字单元数据,再改变SP,即SP=SP+2;可见push、pop指令修改的只是SP,栈顶的变化范围为:0~FFFF栈操作机制:SS:SP指⽰栈顶;改变SP后写内存的⼊栈指令;读内存后改变SP的出栈指令Debug的 T 命令在执⾏修改寄存器SS的指令时,下⼀条指令也紧接着被执⾏(mov ss,ax ; mov ss,[0] ; pop ss)可⽤段寄存器表⽰内存单元的段地址:第四章汇编程序编写汇编源码----编译连接----可执⾏⽂件(包含由汇编指令翻译过来的机器码和源程序中定义的数据以及相关的描述信息,如程序⼤⼩,占⽤多少内存空间等)伪指令:段名 segment ;定义⼀个段,该段从此开始:段名 ends ;该段从此结束end:汇编程序结束的标记assume:含义为“假设”,假设某⼀段寄存器和程序中的某⼀个⽤segment…ends定义的段相关联,⽤于说明关联的关系。
《汇编语言》(王爽)笔记
《汇编语⾔》(王爽)笔记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单元开始,读取⼀条指令并执⾏。
汇编日记
汇编语言(王爽)(No.1 ) DS数据段寄存器通常用来存放要访问数据的段地址(page 60)Example1 :Mov bx,1000H (不能把段地址直接放入ds,因为8086cpu不支持)Mov ds,axMov al,[0]功能:将1000:0中的数据读到al中,[...]表示偏移地址,段地址会自从ds中取出Example 2:Mov bx,1000HMov ds,bxMov ax,[0] (将1000:0处的字型数据送去ax)Mov [0],cx (将cx中的16位数据送到1000:0处)(No.2) 8086的入栈与出栈都是以字为单位进行的Push: sp=sp-2,向ss:sp指向的字单元中送去数据Pop: 从ss:sp指向的字单元中读取数据,sp=sp+2注意:栈空间的大小需要我们自己管理,否则可能会造成栈顶出栈的错误Example1:(1)将10000H~1000FH这段空间当做栈空间,初始状态栈是空的(2)设置ax=001AH,bx=001BH(3)将ax,bx的数据入栈(4)将ax,bx清0(5)从栈中恢复ax,bx原来的内容Code:Mov ax,1000HMov ss,axMov sp,0010H (0010H=000FH+1H,因为sp开始指向栈顶的前一个位置)Mov ax,001AHMov bx,001BHPush axPush bxSub ax,axSub bx,bxPop bxPop axExample2: 如果将10000H~1FFFFH这段空间当做栈段,初始状态是空的,此时Ss=1000H,sp=?Sp=FFFFH+1H=0000H(1略去)(No.3) 汇编指令有对应的机器码指令,而伪指令却没有对应的机器码指令,最终不被cpu 所执行,其实伪指令是由编译器执行的指令,编译器根据伪指令进行相关的编译工作Example1:Code:assume cs:codesegcodeseg segmentMov ax,2000HMov ss,axMov sp,0Add sp,10Pop axPop bxPush axPush bxPop axPop bxMov ax,4c00HInt 21HCodeseg ends (ends代表一个短的结束)End (end代表整个程序的结束)(No.4) [BX]Mov ax,[bx] 把偏移地址bx处的一个字型数据送入axMov [bx],ax 把ax中的字型数据送入偏移地址为bx的内存处*段地址均从ds中读取Loop 标号1.cx=cx-12.判断cx中的值,不为0则转至标号处执行程序Example1:计算2^12次方Code:Assume cs:codeCode segmentMov ax,2Mov cx,11S: add ax,ax (先循环一次,就好比do{}while()循环)Loop sMov ax,4cooHInt 21HCode endsEndExample2:用加法计算123*236,结果存放于ax中Code:Assume cs:codeCode segmentMov ax,123Mov cx,235S:add ax,123Loop sMov ax,4c00HInt 21HCode endsEndExample2:计算ffff:0006单元中的数乘以3,结果存放在dx中(要求用加法指令完成)Code:Assume cs:codeCode segmentMov ax,offffH (汇编指令中不允许以字母开头)Mov ds,axMov bx,6 (把偏移地址送入bx)Mov al,[bx] (0006处是个字节型数据)Mov ah,0Mov dx,0Mov cx,3S:add dx,axLoop sMov ax,4c00HInt 21H (debug中调试,int 21H要用p命令)Code endsend再用debug调试程序时,g ip(如g 0012)可以直接跳到你想执行的地方当遇到loop指令时,使用p命令来执行,Debug就会自动重复执行循环体,直到cx=0为止(No.5) debug和汇编编译器masm对指令的不同处理在debug中,mov ax,[0]表示的是将ds:0处的数据送入ax中但是在汇编源程序中,将被编译器当做mov ax,0处理解决方法:1. mov bx,0Mov ax,[bx] (段地址默认在ds中)2.mov ax,ds:[0](No.6)Loop和[BX]的联合应用Example1:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中问题1:运算后的结果是否会超出dx所能存储的范围问题2:我们能否将ffff:0~ffff:b中的数据直接累加到dx中问题3:我们能否将ffff:0~ffff:b中的数据直接累加到dl中,并设置dh=0,从而实现累加到dx中问题4:我们怎样将ffff:0~ffff:b中的8位数据累加到16位的dx中Code:Assume cs:codeCode segmentMov ax,0ffffhMov ds,axMov bx,0Mov dx,0Mov cx,12S:mov al,[bx]Mov ah,0Add dx,axInc bxLoop sMov ax,4c00HInt 21HCode endsEndExample2:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中Code:Assume cs:codeCode segmentMov ax,0ffffhMov ds,axMov ax,0020hMov es,axMov bx,0Mov cx,12S:mov dl,[BX]Mov es:[bx],dlInc bxLoop sMov ax,4c00HInt 21HCode endsEnd(No.7)包含多个段的程序Example1:Assume cs:codeCode segmentDw 0123H,0456H,0789H,0abcH,0defH,0fedh,0cbah,0987HStart: mov bx,0Mov ax,0Mov cx,8S:add ax,cs:[bx]Add bx,2Loop sMoc ax,4c00HInt 21HCode endsEnd startExample2:Assume cs:code,ds:data,ss:stackData segmentDw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,987HData endsStack segmentDw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0Stack endsCode segmentStart: mov ax,stackMov ss,axMov sp,20H (dw定义了16个字,也就是32个字节,占32(20H)个内存空间)Mov ax,dataMov ds,axMov bx,0Mov cx,8S:push [bx]Add bx,2Loop sMov bx,0Mov cx,8s0:pop [bx]Add bx,2Loop s0Mov ax,4c00HInt 21HCode endsEnd start(No.8)在汇编程序中,以字符形式给出的数据,将会根据ASCII表转换成相应的16进制Example1:Assume cs:code,ds:dataData segmentDb ‘unIX’(相当于db 75H,6eH,49H,58H,因为在ASCII表中’u’,’n’,’I’,’X’分别对应75H,6eH,49H,58H)Db ‘foRK’Data endsCode segmentStart: mov al,’a’ (相当于mov al,61H)Mov bl,’b’Mov ax,4c00HInt 21HCode endsEnd startExample2:将’BaSIC’中的小写字母变大写,把’iNfOrMaTiOn’中的大写字母变小写Assume cs:code,ds:dataData segmentDb ‘BaSIC’Db ’iNfOrMaTiOn’Data endsCode segmentStart: mov ax,dataMov ds,axMov bx,0Mov cx,5S:mov al,[bx]And al,11011111BMov [bx],alInc bxLoop sMov bx,5Mov cx,11S0:mov al,[bx]Or al,00100000BMov [bx],alInc bxLoop s0Mov ax,4c00HInt 21HCode endsEnd start(No.9)更加灵活的寻址方式Example1:把data段中每个单词改为大写字母Assume cs:code,ds:dataData segmentDb ‘ibm ’ (长16个字节,下同)Db ‘dec ’Db ‘dos ’Db ‘vax ’Data endsCode segmentStart: mov ax,dataMov ds,axMov bx,0Mov cx,4S0:mov dx,cx (这里用dx来保存临时的cx的值,但如果dx已经被使用了呢?这是应该开辟栈空间,用栈来保存临时的数据(比如cx))mov si,0Mov cx,3S: mov al,[bx+si]Add al,11011111BMov [bx+si],alInc siLoop sAdd bx,16Mov cx,dxLoop s0Mov ax,4c00Hint 21HCode endsEnd start(No.10)只有bx,si,di,bp这4个寄存器可以用在[...]中来进行内存单元的寻址注意:这4个寄存器可以单独出现,或只能以4种组合出现,组合如下:Bx+siBx+diBp+siBp+si(Bx与bp) (si与di) 是不能一起使用的(No.11)指令执行前,所要处理的数据可以在3个地方:cpu 内部,内存,端口寻址方式有如下几种:[idata] => 直接寻址[bx] => 寄存器间接寻址[bx+idata] => 寄存器相对寻址[bx+si] => 基址变址寻址[bx+si+idata] => 相对基址变址寻址Word ptr指明了指令访问的内存单元是一个字单元例如: mov word ptr ds:[0],1Byte ptr指明了指令访问的内存单元是一个字节单元例如: mov word ptr ds:[0],1Push/pop指令就不需要指明了,因为它们只对字操作(No.12)Div指令的具体使用(page 181)Example1:用div计算data段中第一个数据除以第二个数据后的结果,商存放在第三个数据的存储单元中Assume cs:code,ds:dataData segmentDd 100001 (dd双字,是个伪指令)Dw 100Dw 0Data endsCode segmentStart: mov ax,dataMov ds,axMov ax,ds:[0]Mov dx,ds:[2]Div word ptr ds:[4]Mov ds:[6],axMov ax,4c00HInt 21HCode endsEnd startDup也是伪指令Example:Db 3 dup (0) 定义了三个字节,他们的值都是0,相当于db 0,0,0Db 3 dup (0,1,2) 定义了九个字节,相当于db 0,1,2,0,1,2,0,1,2Db 3 duo (‘abc’,’ABC’) 相当于db ‘abcABCabcABCabcABC’Dup的使用格式如下Db 重复的次数duo (重复的字节型数据)dw 重复的次数duo (重复的节型数据)dd 重复的次数duo (重复的双字型型数据)(No.13)转移指令只修改ip时,称为段内转移同时修改cs和ip时,称为段间转移例如jmp far ptr 标号段内转移:短转移例如jmp short 标号范围:-2^7 ~ 2^7-1近转移例如jmp near ptr 标号范围:-2^15 ~2^15-1转移地址在寄存器中的jmp指令Example: jmp ax转移地址在内存中的jmp指令Example:jmp word ptr 内存单元地址(段内转移)Jmp dword ptr 内存单元地址(段间转移) 高位的字单元是段地址,低位的字单元是偏移地址Jcxz 是有条件转移指令所有的有条件转移指令都是短转移只有当cx=0才跳转,不然什么也不做,功能相当于If(cx==0) jmp short 标号Loop指令为循环指令所有的循环指令都是短转移(No.14)转移指令(call和ret/retf)他们都修改ip,或同时修改cs和ipRet 近转移(修改ip) 相当于pop ipRetf 远转移(修改ip和cs) 相当于pop ipPop csExample:retf执行后,cs:ip指向代码段的第一条指令Assume cs:code,ss:stackStack segmentDb 16 dup (0)Statck endsCode segmentmov ax,4c00HInt 21HStart:mov ax,stackMov ss,axMov sp,16Mov ax,0Push csPush axMov bx,0 //这句有什么用Retf (从栈中弹出地址并跳转到该地址)Code endsEnd startCall1.将当前的ip或cs和ip压入栈中2.转移不能实现短转移,其余原理和jmp很像(因为栈是对字操作的(16位))Call 标号相当于执行了Push ipJmp near ptr 标号Call far ptr 标号相当于执行了Push csPush ipJmp far ptr 标号转移地址在寄存器中的call指令Call ax 相当于执行了Push ipJmp ax转移地址在内存中的call指令Call word ptr 内存单元地址相当于执行了Push ipJmp word ptr 内存单元地址Call dword ptr 内存单元地址相当于执行Push csPsuh ipJmp dword ptr 内存单元地址(No.15)子程序设计Example:编程计算data段中的第一组数据的3次方,结果保存在后一组dword单元中Assume cs:code,ds:dataData segmentDw 1,2,3,4,5,6,7,8Dd 0,0,0,0,0,0,0,0Data endsCode segmentStart:mov ax,dataMov ds,axMov si,0Mov di,16Mov cx,8S:mov bx,[si]Call cubeMov [di],axMov [di+2],dxAdd si,2Add di,4Loop sMov ax 4c00HInt 21HCube:mov ax,bxMul bxMul bxretCode endsEnd startExample2:批量数据传递将data数据段中的字符串转换为大写分析:字符串可能很长,如果用有限的寄存器传递的话,是不现实的我们可以传递字符串的首地址,并用cx控制循环次数来达到目的Assume cs:code,ds:dataData segmentDb ‘conversation’Data endsCode segmentStart:mov ax,dataMov ds,axMov si,0Mov cx,12Call capitalMov ax,4c00HInt 21HCapital:and byte ptr [si],11011111BInc siLoop capitalretCode endsEnd startExample3:将data数据段中的的字符串全部转换为大写,遇0结束Assume cs:code,ds:dataData segmentDb ‘word’,0Db ‘unix’,0Db ‘wind’,0Db ‘good’,0Data endsCode segmentStart:mov ax,dataMov ds,axMov bx,0Mov cx,4S:mov si,bxCall capitalAdd bx,5Loop sMov ax,4c00HInt 21HCapital:push cxPush siChange:mov cl,[si]Mov ch,0Jcxz okAnd byte ptr [si],11011111BInc siJmp short changeOk:pop siPop cxretCode endsEnd start注意:编写子程序一定要注意寄存器冲突问题add,sub包含两种含义:进行无符号运算,进行有符号运算。
汇编语言(王爽)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,机器码如下。
《汇编语言》学习笔记(清华大学王爽)
《汇编语言》学习笔记(清华大学王爽)清华大学《汇编语言》(王爽)读书笔记第一章基础知识◎汇编语言由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数据段寄存器。
- 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来存放从端口中读入的数据或要发送到端口中的数据。