汇编初探之8086汇编笔记1-8章(来源:汇编语言第三版)
第一章 基础知识1.汇编指令是机器指令的助记符,与机器指令一一对应。
2.每一种CPU都有自己的汇编指令集。
3.存储器中指令和数据没区别,都是二进制。
4.CPU通过外部的地址总线、控制线、数据线对内存(存储器)进行存储和读取。
5.N根地址线表明CPU的地址总线宽度为N,寻址能力为2的N次方个内存单元。
6.控制总线的宽度决定了CPU对外部器件的控制能力。
7.8086CPU数据总线宽度为16,表示一次可传送16位数据。
8.存储器分类:随机存储器(RAM)和装有BIOS的只读存储器(ROM)。
第二章 寄存器(AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW)
1.CPU通常由运算器、控制器、寄存器等构成,靠内部总线相连。
2.不同的CPU,寄存器的个数、结构是不相同的;8086CPU有14个寄存器,都是16位。
3.通用寄存器:AX、BX、CX、DX,分高八位和低八位,如AX,可拆分成AH和AL。
4.8086CPU通过地址加法器来合成20位的物理地址:物理地址=段地址*16+偏移地址。
5.CS为代码段寄存器,IP为指令指针寄存器,CS存放指令的段地址,IP存放指令的偏移地址;任意时刻,CS:IP指向的内容当作指令执行;每执行指令一次就会改变IP。
6.jmp指令:修改CS、IP,如 jmp 2AE3:0003,或只改IP,如 jmp 某一合法寄存器(ax)
7.Debug程序:
R命令查看、改变CPU寄存器的内容
D命令查看内存中的内容
E命令改写内存中的内容
U命令将内存中的机器指令翻译为汇编指令
T命令执行一条机器指令
A命令以汇编指令的格式在内存中写入一条机器指令
第三章 寄存器(内存访问)
1.起始地址为N的字单元由单元N和单元N+1组成,如0号单元存放数据12H,1号单元存放数据40H,则0的字数据为4012H。
2.DS为数据段寄存器,不可直接将数据送入段寄存器,因为8086CPU不支持,指令使用的单元的默认段地址为DS的值。
3.CPU的入栈与出栈:段寄存器SS来存放栈顶的段地址,寄存器SP存放栈顶的偏移地址;任意时刻,SS:SP指向栈顶元素。
4.push和pop的指令,出入栈都会改变SP,如push ax、pop 。
5.栈顶往下的一段空间为栈段,即SS:IP指向的地址往下,栈段最大容量为64KB。
6.内存既可以是代码的存储空间,又可以是数据的存储空间,还可以是栈空间,也可以什么也不是。
7.执行t指令后,内存会记录上一条已经执行的指令信息。
第四章 第一个程序
1.汇编源程序编写到执行过程:1)编写汇编源程序 2)编译生成目标文件,用连接程序对目标文件连接,生成可执行文件 3)执行
2.汇编源程序组成:
1)伪指令:由编译器执行
如:XXX segment.........XXX ends (*定义一个名称为XXX的段)
end (*汇编程序的结束标记)
assume cs:XXX (*假设某一个寄存器cs与XXX段相关联)
2)汇编指令:由CPU执行(通常在段里面)
如:mov ax,4c00Hint 21H (*这两句汇编指令为程序返回)
3)标号: 一个标号指代一个地址
如:段名称XXX (最终被处理为一个段的段地址)
3.通过编译和连接生成第一个程序并执行(具体请看书)
4.通过Debug程序进行跟踪:
1)加载.exe后,cx寄存器存放的是程序的长度
2)DOS系统.exe文件加载过程:
(1)找到起始地址的空闲内存区,
(2)这段内存的前256个Byte中创建一个程序段前缀(PSP),DOS利用PSP来和被加载程序进行通信
(3)将程序装入PSP后面,程序的地址为: PSP段地址+10H:0
(4)将内存区地址的段地址存入ds中,初始化其他相关寄存器后,设置CS:IP指向程序入口
3)汇编指令(int 21H)需要用P命令执行
第五章和loop指令(cx寄存器的值为循环次数)
1.inc 寄存器 (表示内容加一)
2.loop指令执行:1)判断cx寄存器的值减1是否为0,否则转至标号处执行程序
例(cx为10,执行10次循环):s:add ax,ax
loop s
3.字节单元(如ffff:6)赋值16位寄存器(如ax),数据长度不同应先令(ah)=0,(al)=(ffff6h)
4.汇编源程序中,数据不能以字母开头,如A000h要写为0A000h
5.Debug命令g来执行到某个位置(如g 0012来执行cs:0012前的程序段),Debug命令p来一次执行完循环(loop指令)
6.Debug和汇编编译器masm(源程序)对指令不同处理:指令mov ax,被编译器当作指令mov ax,0处理
解决办法(源程序中): 如 mov ax,ds:
表明如果汇编源程序内存单元[...]中为常量必须在前面显式给出段地址所在寄存器
7.段前缀:显式给出内存单元的段寄存器(默认ds),如mov ax,cs:
8.DOS下,系统或其他合法程序的数据或代码一般不会使用0:200~0:2ff内存空间
第六章 包含多个段的程序
1.dw的含义:定义字型数据(define word),如dw 0123h,0456h
2.end 标号 (指定程序入口,end的另一作用)
第七章 更灵活的定位内存地址的方法
1.and命令(与):将相应位设为0
2.or命令(或):将相应位设为1
3.:更灵活表示内存单元,也为高级语言实现数组提供便利机制。如:;也可写成200或.200
4.SI和DI无法分成两个8位寄存器
5.或:更灵活表示内存单元,也可写成和;
6.:更灵活表示
7.一般暂存数据都应该使用栈
第八章 数据处理的两个基本问题(书上定义的描述性符号寄存器reg和段寄存器sreg)
1.8086CPU中[...]表示单元地址的值,如果是寄存器,只能用bx,bp,si,di或其组合,但bx与bp不能同时存在,si与di同理
2.bp默认段地址为ss的值
3.机器指令处理数据的位置:1.cpu内部 2.内存 3.端口
4.汇编中数据位置的表达:1.立即数(idata) 2.寄存器 3.段地址(SA)和偏移地址(EA)
5.寻址方式:
1)直接
2)寄存器间接
3)寄存器相对,如:.idata或
4)基址变址,如:
5)相对基址变址,如:.idata或idata
6.指明指令处理的数据长度
1)通过寄存器
2)没有寄存器存在时,用操作符X ptr指明,可以为word或byte,如mov word ptr ds:,1
3)其他,如默认指令push只进行字操作
7.除法指令:div
1)除数:8位和16位,位于reg或内存单元
2)被除数:除数位为8位时,被除数为16位默认位于AX中;除数位为16位时,被除数为32位默认高16位为DX,低16位为AX
3)结果:除数位为8位时,AL为商,AH为余数;除数位为16位时,AX为商,DX为余数
4)格式:div reg或div 内存单元
8.伪指令:dd,定义双字型数据(double word)
9.操作符dup:数据重复,和db、dw、dd等数据定义伪指令配合使用
使用格式:1)db 重复次数 dup (重复的字节型数据)
2)dw 重复次数 dup (重复的字型数据)
3)dd 重复次数 dup (重复的双字型数据) 帖子有点水{:1_890:}
页:
[1]