您的位置:首页 > 其它

汇编语言(王爽著)笔记

2013-12-09 16:41 134 查看
来源:http://blog.chinaunix.net/uid-22784501-id-383492.html

第一章 基础知识

1.汇编语言组成:(1)汇编指令:机器码的助记符,有对应的机器码,由机器执行

(2)伪指令:编译器执行

(3)其他符号:如+,-,*等,编译器识别,没有对应的机器码

2.存储器以字节为最小单位

3.cpu管脚上的三种总线:(1)地址总线,决定cpu的寻址能力

(2)数据总线,决定cpu一次传送的能力,通常与cpu位数一样

(3)控制总线,控制读写等

4.内存地址空间:所有的存储器合称为cpu的内存地址空间,无论是各种RAM,ROM,端口

第二章 寄存器

1.8086cpu有14个寄存器,分别:AX,BX,CX,DX, SI,DI,SP,BP,IP, CS,SS,DS,ES, PSW

AX,BX,CX,DX为通用寄存器,常用来存放一般性的数据。

为了兼容上一代cpu,AX,BX,CX,DX可分为两个独立使用的8位寄存器,分别为AH,AL......

谨记:AH,AL是独立使用的,是无联系的

2.常用的几条汇编指令

mov ax,18 mov ah,78 add ax,8

注意在进行数据传送或运算时,两个操作对象的位数应当为一致

3.数制的概念

16进制表示的数据后面加H,2进制的后面加B

一个X进制的数据左移1位,相当于乘于X

4.16位机的意思:

(1)运算器一次最多处理16位的数据

(2)寄存器最大宽度为16位

(3)寄存器和运算器之间通路为16位,即数据总线16条

5.8086传送物理地址方法是:段地址*16+偏移地址=物理地址

段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数

偏移地址为16位,16位地址寻址能力为64KB,所以一个段最大长度为64KB

6.段寄存器

4个段寄存器:CS,DS,SS,ES

CS为代码段寄存器,IP为指令指针寄存器

8086机中,任意时刻,cpu将CS:IP指向的内容当做指令执行

8086CPU加电启动或复位后,CS和IP被设置为CS=FFFFH,IP=0000H

FFFF0H单元中的指令时8086PC机开机后执行的第一条指令

7.修改CS,IP的指令

想同时修改CS,IP

jmp 1000:0 则CS=1000H,IP=0000H

仅修改IP的内容

jmp 某一合法寄存器

8.8086cpu工作过程:

(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

(2)IP指向下一条指令

(3)执行指令。(转到步骤(1),重复这个过程

9.DEBUG的功能

(1)用R命令查看,改变cpu寄存器内容

例子:r 功能:查看寄存器

r ax 功能:修改ax寄存器内容

(2)用D命令查看内存中内容

例子:d 1000:0

d 1000:0 f

(3)用E命令改写内存中的内容

例子:采用“e 起始地址 数据 数据 数据..." e 1000:0 0 1 2 3 4 5 6 7 写机器码

采用提问方式一个一个地改写内存的内容 e 1000:0

可以向内存中写入字符 e 1000:0 1 'a' 2 'b' 3 'c' 写机器码和字符

(4)用U查看内存中机器码含义,用T执行内存中的机器码

(5)用A以汇编指令形式在内存中写入机器指令

(6)注意ROM的地址范围是无法改变其内容的

(7)用g命令跳到某指令 用t命令单步执行 用p命令跳跃循环

第三章 寄存器(内存访问)

1.DS段寄存器,通常用来存放要访问数据的段地址

[...] 表示一个偏移地址为...的内存单元,8位,其段地址默认在DS

2.8086不支持将数据直接送入段寄存器,应该先将数据送入一个一般的寄存器,如AX,再将AX送入DS

3.字的传送:只要在mov指令中给出16位的寄存器就可以进行16位的传送

在内存和寄存器之间传送字型数据时,高地址单元对应高8位寄存器,低地址单元对应低8位寄存器

4.栈

8086出入栈都是以字(16位)为单位进行的

SS:SP指向栈顶,改变SP后写内存的是入栈,读内存后改变SP的是出栈

push:SP=SP-2;向SP:SP指向的字单元中送入数据

pop:从SS:SP指向的字单元中读数据;SP=SP+2

8086只记录栈顶,栈空间的大小要我们自己管理

5.段

数据段:段地址在DS

代码段:段地址在CS,偏移地址在IP

栈段: 段地址在SS,偏移地址在SP

6.一段内存,可以使用代码段,数据段,栈段,关键是各寄存器的设置,即CS,IP,SS,SP,DS

第四章 一个程序

1.debug 将可执行程序加载入内存后,cx中存放的是程序的长度

2.可执行程序加载入内存时,会有一个psp,即进程描述符,占用256(100H)字节。

第五章 [BX]和loop指令

1.cx寄存器是存放循环次数,与loop相配合

2.在汇编源程序中,数据不能以字母开头,如mov ax,0ffffh

3.在dos下,一般情况,0:200-0:2ff空间中没有系统或其他程序的数据或代码

4.mov指令 不支持内存到内存的数据传送,必须要借助寄存器 (这是当然的,硬件是这么设计的)

5.cpu 在读取指令的时候更改IP寄存器的值,而不是在执行指令后;(在cpu读指令时,程序计数器会加1,也即是ip寄存器,这在组成原理上)而jmp指令是用来更改指令地址的,所以当jmp指令刚刚执行完毕,ip更改两次。

第六章 包含多个段的程序

1.段名相当于标号,只代表段地址

2.在汇编语言用assume将cs与code联系起来,只不过是要告诉编译器,对机器执行时没有影响的,必须在机器指令中将code标志的地址送进cs才有用。要记住,assume只是伪代码,只是在源程序存在的信息,编译后就灭有

3.cpu到底如何处理我们定义的段中的内容,是当做指令或数据,还是栈空间,完全是靠程序中具体的汇编指令,和汇编指令对cs:IP,ss:sp,DS等寄存器的设置

第七章 更灵活的定位内存地址的方法

1.and 按位与 and al,10111111B 通过该指令可将操作对象的相应位设为0

or 按位或 or al,01000000B 通过该指令可将操作对象的响应位设为1

2.以'....'的方式指明数据是以字符的形式给出的 如db 'unix'

3.大小写转换可用按位或转换

4.SI,DI是8086与bx功能相近的寄存器,SI,DI不能够分成两个8位寄存器来使用

5.寻址方式[bx(或si,di)+idata],[bx+si或di],[bx+si(或di)+idata] 的意义

6.二重循环或数组等表示方法

第八章 数据处理的两个基本问题 数据在哪与数据多长

1.bx、si、di、bp 只有这4个寄存器可以在[..]中进行内存单元的寻址

在[...],这4个寄存器可以单独出现,或以4种组合出现:bx和si,bx和di,bp和si,bp和di

如果使用bp,段地址默认在ss中

2.不同的寻址方式p164,有数组,结构体等,解决了数据在哪的问题

3.指令处理的数据的长度

8086cpu只能处理byte或word

(1) 通过寄存器指明

(2) 在没有寄存器名存在的情况下,用word ptr 或 byte ptr

mov word ptr ds:[0],1

mov byte ptr ds:[0],1

(3)有些指令默认了访问的字单元还是字节单元,如push

4.div 除法指令

5.dd 定义dword 双字型数据,伪指令,db,dw

6.dup 是和db,dw,dd等数据定义伪指令配合使用的,用来进行数据的重复

7.寻址方式的综合运用

p166的例子说明了如何合理的利用寻址方式

第九章 转移指令的原理

1.可以修改IP,或同时修改CS和IP的指令统称为转移指令

只修改IP,称为段内转移,段内分为短转移,-128~127 近转移-32768~32767

同时修改CS和IP,称为段间转移

2.offset 符号

伪指令,功能是取得符号的偏移地址,即与IP为0的偏移

3.jmp 所对应的机器码中,不包含转移的目的地址,而是转移的位移

jmp short 标号 功能是(IP)=(IP)+8位位移 范围为-128~127,补码表示 位移的机器码占1个字节

jmp near 标号 功能是(IP)=(IP)+16位位移 范围为-32768~32767,补码表示 位移的机器码占2个字节

4.jmp far ptr 标号 实现段间转移,包含转移的目的地址

而jmp 标号 编译器会根据标号的不同位置,进行以上三种不同编译

5.jmp 16位register 功能(ip)=(16位reg)

6.jmp word ptr 内存单元(段内转移)

功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址=(ip)

jmp dword ptr 内存单元(段间转移)

功能:从内存单元地址处开始存放着两个字,是转移的目的偏移地址,高地址处的字是(CS),低地址的字是(IP)

7.有条件转移指令 jcxz 短转移,包含的机器码中是转移的位移,对ip的修改范围:-128~127

功能相当于if((cx)==0)jmp short 标号

8.循环指令 loop 短转移 包含的机器码中是转移的位移,对ip的修改范围:-128~127

功能相当于 (cx)--;if((cx)!=0) jmp short 标号

9. jmp short 标号

jmp near ptr 标号

jcxz 标号

loop 标号

等几种汇编指令,它们对IP的修改是根据目的地址和转移起始地址之间的位移来进行的,在它们对应的机器码中不包含转移的目的地址,而包含的是目的地址的位移,这种设计,方便了程序段在内存中的浮动装配

如果转移位移超界,在编译时,编译器会报错。

10.一个nop指令预留了一个字节的空间

第十章 call和ret指令 都是转移指令 call即是调用,ret即是返回 call和ret是进行子程序设计的

1. ret 功能是 pop ip 近转移

retf 功能是pop ip pop cs 远转移

2.call 标号 根据位移进行转移

功能是 push ip

jmp near ptr 标号

call far ptr 标号 根据目的地址进行转移

功能是 push cs

push ip

jmp far ptr 标号

3.call 16位 reg

push ip

jmp 16位reg

4.call word ptr 内存单元地址

push ip

jmp word ptr 内存单元地址

5. call dword ptr 内存单元地址

push cs

push ip

jmp dword ptr 内存单元地址

6.mul 乘法指令

7.模块化程序设计

对于批量参数的传递,有两种

(1)将批量的数据放到内存,然后将他们所在的内存空间的首地址放在寄存器,传递给需要的子程序

(2)利用栈来进行。C语言就是用栈传递参数

8.编写子程序

注意,开始时保存现场,即把子程序使用的所有寄存器入栈,结束时恢复现场

子程序的标准框架:

子程序开始:子程序使用的寄存器入栈

子程序内容

子程序中使用的寄存器出栈

返回(ret,retf)

第十一章 标志寄存器

1.zf标志,zero flag 执行结果为0,这zf=1,否则zf=0

大多运算指令会影响标志寄存器,而传送指令mov,push,pop等不会影响,在使用一条指令时,要注意这条指令执行结果会对标志寄存器产生什么影响

2.pf parity flag 奇偶标志位 结果bit位1的个数为偶(0,2...),则pf=1,否则pf=0

3.sf symbol flag 符号标志位 结果为负,则sf=1. 主要进行有符号数运算时进行判断

4.cf carry flag 进位标志位 在进行无符号数运算的时候,有进位或借位,cf=1

5.of overflow flag 溢出标志位 进行有符号数运算

6.adc 指令 带进位加法指令 2个数相加再加进位

作用 可以对更大的数据进行加法运算

7.sbb 带借位减法指令 对任意大的数据进行减法运算

8.cmp 比较指令,相当于减法运算,不保存结果,只对标志寄存器影响

cmp指令主要用于条件转移

je jne jb jnb ja jna

equal below above

9.df标志和串传送

direction flag 方向标志位

cld sld 设置字符串的传输方向

rep movsb

10.pushf和popf

用于标志寄存器的入栈与压栈

第十二章 内中断

1.对于8086cpu,内中断分为以下4类:

(1)除法错误,比如除法溢出 中断类型码为0

(2)单步执行 中断类型码为1

(3)执行into指令 中断类型码为4

(4)执行int指令 int n n即为中断类型码

2.TF标志位为单步中断,IF标志位为中断屏蔽 if为1,执行,if为0,不执行

内中断所引发的中断过程:

(1)取中断类型码n;

(2)标志寄存器入栈,IF=0,TF=0

(3)CS,IP入栈

(4)(IP)=(n*4),(CS)=(n*4+2)

注意:上面的过程是cpu在响应中断时一次性完成的,设置IF,tf为0的目的是防止在执行相应的中断响应程序时再发生中断事件

3.中断类型码为1个字节型数据,可以表示256种中断信息

内存0000:0000到0000:03ff的1024个单元存放着中断向量表

即每4个单元存放1个表项,即相应的中断响应程序的地址,高地址字存放段地址,低地址字存放偏移地址

4.TF是单步中断的标志,IF是内中断屏蔽

对TF的设置命令是stt,clt

对IF的设置指令是sti,cli

利用对这两个标志位的设置,可保证程序在运行中不接受中断,防止在一些必须一次性完成某过程的程序段出错,这是非常重要的程序设计方法

5.中断的应用主要是自己安装中断例程,然后用程序调用它,或者用程序直接调用BIOS或DOS所提供的中断例程

6.在执行完向ss寄存器传送数据的指令后,cpu会接着执行下一条指令,而不会响应中断,这是因为ss:sp指向栈顶,对它们的设置必须连续完成,所以设置ss和sp的指令应该连续存放。

第十三章 int指令

1.内中断的一种:int

ah为参数,表示n号中断例程里面的子程序的编号

int n n为中断类型码,功能是引发n号中断例程

int 指令的功能与call相似,都是调用一段程序,返回时用iret

iret功能是 pop IP

pop CS

popf

2.BIOS和DOS所提供的中断例程 BIOS是固化在系统板ROM上的一套程序

BIOS包含:(1)硬件系统的检测和初始化程序

(2)外部中断和内部中断的中断例程

(3)用于对硬件设备进行I/O操作的中断例程

(4)其他和硬件系统相关的中断例程

DOS也提供了中断例程

BIOS和DOS的中断例程安装到机器上P259

第十四章 端口

端口,即各种接口卡上的芯片上的寄存器,cpu对这些寄存器当做端口,进行统一编址,从而建立了一个统一的端口地址空间,cpu通过对这些端口的访问与各种外设进行连接。

外设的输入不直接送入内存和cpu,而是送入相关的借口芯片的端口,cpu向外设输出也是端口

1.CPU可以直接读写以下3个地方的数据

(1)cpu内部的寄存器 (2)内存单元 (3)端口(各芯片上的寄存器)

2.端口的读写指令只有两条:in和out 用于从端口读取数据 和 往端口写入数据

注意:在in和out指令中,只能使用ax和al来存放从端口中读入的数据或要发送到端口中的数据

3.shl 逻辑左移指令 shr 逻辑右移指令

4.CMOS芯片存放着实时钟和系统配置信息,供系统启动时BIOS程序读取。

第十五章 外中断

1.外中断源:

(1)可屏蔽中断

当cpu检测到可屏蔽中断信息时,如果IF=1,则cpu在执行完当前指令后响应中断,引发中断例程;如果IF=0,则不响应可屏蔽中断

(2)不可屏蔽中断

其中断类型码固定为2

2.键盘输入的处理过程

(1)键盘产生扫描码;(2)扫描码送入60h端口;(3)引发9号中断;(4)cpu执行int 9中断例程处理键盘输入

重要知识点:

在编程时对于一些必须一步完成的过程应该注意屏蔽中断,可使用cli sti进行设置

见例题p280

第十六章 直接定址表 即哈希表

地址标号:地址标号即那些只是表示地址的标号,有“:”

数据标号:即包含地址,又包含对单元长度的描述,没有“:”

主要用于直接定址表

第十七章 使用BIOS进行键盘输入和磁盘读写

int9中断例程是对键盘输入的处理,将其输入送进键盘缓冲区

int16中断例程是从键盘缓冲区取出键盘输入的扫描码及ASCII码

综合研究

在C语言中,编程都要用到变量

要从main函数开始

printf函数接受的参数数量不定

1.我们可以使用寄存器存储数据,而不需要用到变量

2.不用main函数编程,C语言中对于main函数是采取调用,编译后就是汇编调用子程序,一定要采用main函数是因为C开发系统提供的一个obj文件里的程序要对main函数进行调用,这个文件将会连接在main函数的前面,这个文件时对C程序的初始化

3.C函数接受不定数量的参数是采用栈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: