目录
chapter7:更灵活的定位内存地址的方法
1.and和or指令
- and指令:按位进行与运算(同为1结果才为1)
执行下面两条指令后,al=00100011B
mov al,01100011B
and al,00111011B
- or指令:按位进行或运算(一个为1结果就为1)
执行下面两条指令后,al=01111011B
mov al,01100011B
or al, 00111011B
2.大小写字母的转换问题
- 大写字母转小写字母:+20H,即将第五位置为1
or al,00100000 ;假设al存储着相应的字母字符
- 小写字母转大写字母: -20H,即将第五位置为0
and al,11011111
3.[bx+idata]
- [bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
;该指令含义为将一个字单元的内容送入ax寄存器中
;该字单元存放一个字,偏移地址为bx中的数值加上200,段地址在ds中
mov ax,[bx+200]
mov ax,200[bx]
mov ax,[bx].200
;上述三条指令等价
4.SI和DI
si和di是8086CPU中和bx功能相近的寄存器,但是si和di不能拆分为两个8位寄存器使用。
[bx+si]和[bx+di]
- [bx+si]或者[bx+di]表示一个内存单元,偏移地址为(bx) + (si),[bx+di]同理
几种定位内存地址的方法
- [常量值]:用一个常量表示地址,可以用来直接定位一个内存单元
- [bx]:用一个变量来表示内存地址,可用来间接定位一个内存单元
- [bx + 常量值]:用一个变量和常量来表示内存地址,可以在一个起始地址的基础上用变量间接定位一个内存单元
- [bx+si]:用两个变量来表示地址
- [bx+si + 常量值]:用两个变量和一个常量来表示地址
chapter8:数据处理的两个基本问题
1.两个基本问题
- 处理的数据在什么地方:机器指令处理的数据可以在CPU内部(内部的寄存器等),内存,端口
- mov bx,ds:[0]:指令执行前数据在内存
- mov bx, ax:指令执行前数据在寄存器
- mov bx, 1:指令执行前数据在CPU内部的指令缓冲器中
- 要处理的数据有多长:8086CPU的指令可以处理两种尺寸的数据:byte和word。机器指令中指明指令进行的是字节操作还是字操作的方法如下:
- 通过寄存器名指明要处理的数据的尺寸
; 字操作 inc ax ; 字节操作 inc al mov al,ds:[0]
- 在没有寄存器名存在的情况下用操作符
word ptr
或者byte ptr
指明内存单元的长度,比如说inc word ptr ds:[0]
- 有些指令默认访问的是字单元还是字节单元
比如push和pop指令默认访问的是字单元
2.bx,si,di,bp
- 在8086CPU中,只有这四个寄存器可以用在[...]中进行内存单元的寻址
;例如
mov ax,[si]
mov ax,[si+bx]
3.汇编语言中数据位置的表达
- 立即数(idata):立即数就是直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)。立即数直接在汇编指令中给出。
;比如
mov al,'a'
add bx,2000H
- 寄存器:指令要处理的数据在寄存器中.在汇编指令中给出相应的寄存器名
;比如
mov ds,ax
- 段地址(SA)和偏移地址(EA):指令要处理的数据在内存中,在汇编指令中可以用[X]的格式给出EA,段地址SA存储在某个段寄存器中。存放段地址的寄存器最好通过段前缀显性给出。
;存放段地址的寄存器可以是默认的
;1. 存放段地址的寄存器默认在DS中
mov ax,[bx+si+8] ;即等同于mov ax,ds:[bx+si+8]
mov ax,[0]
;2.存放段地址的寄存器默认在SS中
mov ax,[bp+si+8]
4.寻址方式
定位内存单元的偏移地址的方法称为寻址方式。8086CPU中的寻址方式如下图:
5.div指令(除法指令)
- 除数:有8位或者16位,在一个寄存器中或者内存单元中
- 被除数:默认放在AX中,或者AX和DX中。如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,则被除数为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
- 结果:
- 如果除数为8位,则AL存储商,AH存储余数
- 如果除数为16位,则AX存储商,DX存储余数
- 格式
div 寄存器
div 内存单元
6.伪指令dd
- db:定义字节型数据
- dw:定义字型数据,占用两个字节
- dd:定义双字型数据,占用四个字节
;例如data段定义三个数据
;第一个数据为01H
;第二个数据为0001H
;第三个数据为00000001H
data segment
db 1
dw 1
dd 1
data ends
7.dup操作符
- dup是一个操作符,也是由编译器识别处理的符号。他是和db,dw,dd等数据定义伪指令配合使用的,用来进行数据的重复。
- dup的使用格式如下:
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
- 示例
db 3 dup (0) ;表示定义了三个字节,值都是0,等同于db 0,0,0
db 3 dup (0,1,2);定义了九个字节,他们是012012012
;定义一个容量为200个字节的栈段
stack segment
db 200 dup (0)
stack ends
chapter9:转移指令的原理
1.概述
- 转移指令:可以修改IP或者同时修改CS和IP的指令称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令。
- 8086CPU的转移行为有以下几类:
- 段内转移:只修改IP,比如说jmp ax
段内转移又分为短转移和近转移。短转移IP的修改范围为-128到127
近转移IP的修改范围为-32768到32767 - 段间转移:同时修改CS和IP,比如jmp 1000:0
- 段内转移:只修改IP,比如说jmp ax
- 8086CPU的转移指令分为以下几类
- 无条件转移指令(比如jmp)
- 条件转移指令
- 循环指令(比如loop)
- 过程
- 中断
2.操作符offset
- 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
- 使用示例
assume cs:codesg
codesg segment
;(第一条指令长度为3个字节)
start:mov ax,offset start ;等同于mov ax,0
s:mov ax,offset s ;等同于mov ax,3
codesg ends
end start
3.jmp指令
jmp指令为无条件转移指令
1. jmp指令需要给出两种信息:
- 转移的目的地址
- 转移的距离(段间转移,段内短转移,段内近转移)
2. 根据位移进行转移的jmp指令
- 这种汇编指令对应的机器码并不包含转移的目的地址,而是包含转移的位移(相对于当前IP值的转移位移)。
- 格式
;将转到标号处执行指令
;short说明指令进行的是段内短转移,对IP的修改范围-128到127
;标号是代码段中的标号,指明指令要转移的目的地
jmp short 标号
;段内近转移
jmp near ptr 标号
3.功能
功能为 (IP) = (IP) + 8位位移
8位位移 = 标号处的地址 - jmp指令后的第一个字节的地址
jmp short 标号
功能为 (IP) = (IP) + 16位位移
16位位移 = 标号处的地址 - jmp指令后的第一个字节的地址
jmp near ptr 标号
位移由编译程序在编译时算出
3.转移的目的地址在指令中的jmp指令
- 段间转移(远转移)
;far ptr指明了指令使用标号的段地址和偏移地址修改CS和IP
jmp far ptr 标号
4.转移地址在寄存器中的jmp指令
- 指令格式:jmp 16位寄存器
- 功能:(IP) = (16位寄存器)
5.转移地址在内存中的jmp指令
- 转移地址在内存中的两种jmp指令格式
- 格式1:
jmp word ptr内存单元地址
(段内转移)功能是从内存单元地址处开始存放一个字,是转移的目的偏移地址 - 格式2:
jmp dword ptr内存单元地址
(段间转移)功能是从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的偏移地址
- 格式1:
- 示例
;指令执行后,(IP) = 0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
;指令执行后,(CS) = 0,(IP) = 0123H
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
4.jcxz指令
- jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移。在对应的机器码中包含转移的位移而不是目的地址。对IP的修改范围为-128到127
- 指令格式:
jcxz 标号
- 功能:如果(cx) = 0,则转移到标号执行。当(cx) = 0时,(IP) = (IP) + 8位位移。8位位移等于标号处的地址减去jcxz指令后的下一条指令的地址 这条指令的功能相当于:
if ((cx) == 0)
{
jmp short 标号 // 段内短转移
}
5.loop指令
- loop指令为循环指令,所有的循环指令为段内短转移。在对应的机器码中包含转移的位移,而不是目的地址。
- 指令格式:loop 标号
- 功能:(cx) = (cx) - 1,如果(cx)!= 0,转移到标号处执行。
loop指令的功能相当于:
(cx)--
if ((cx) != 0)
{
jmp short 标号
}
6.cmp指令
根据某种条件决定是否转移。(修改IP)。所有条件转移指令的转移位移都是-128到127(段内短转移)
- 因为cmp指令可以同时进行无符号数和有符号数比较,所以根据cmp指令的比较结果进行转移的指令也分为两种。