汇编语言学习笔记
2016-09-09 10:45
127 查看
一、补码
00000000b~01111111b表示0~127,按位取反后加1表述负数:
00000000b:0 11111111b+1=00000000b:0
00000001b:1 11111110b+1=11111111b:-1
00000010b:2 11111101b+1=11111110b:-2
01111111b:127 10000000b+1=10000001b:-127
结论:
1)最高位为1,表示负数
2)正数补码取反加1后为负数的补码;负数的补码取反加1后位其绝对值。比如:
1的补码位00000001b,取反加1后位:11111111b,表示-1
-1的补码位11111111b,取反加1后位:00000001b,其绝对值位1
利用此特性可以得知负数补码代表什么数值
二、寄存器
1、CS为指令段寄存器;IP为指令指针寄存器;CS:IP(CS*16+IP)为指令地址
不可使用mov指令直接修改寄存器值,可使用jmp指令:jmp 2Ae3:3 同时修改CS和IP;jmp ax 单独修改IP
2、DS为内存数据寄存器;ds设值后,[bx]取指定索引数据;或者DS:[bx]
不可mov一个立即数给它,使用mov bx,1000h; mov ds,bx来赋值
ES指向附加段,和DS功能相同,都可访问内存,特殊情况:进行串操作时,目的地址的段寄存器规定为ES。
3、SS为栈段寄存器;SP为栈指针寄存器;SS:SP(SS*16+SP)指向栈顶元素
PUSH:SP=SP-2后入栈
POP ax:SS:SP数据取到ax,SP+=2;
PUSH、POP可以对段寄存器做操作
4、BX、SI、DI、BP,只有这四个寄存器可以存放内存索引:
mov ax,[si]
mov ax,[bx+si]
mov ax,[si+idata]
组合情况只有四种:bx+si;bx+di;bp+si;bp+di
使用到BP寄存器,默认段在SS中;其他默认DS中。
5、CX存放循环次数:
mov cx,12
s: add dx,ax
loop s
存储条件转移指令的条件:
jcxz s
6、DX、AX默认存放除数:
除数16位则默认放AX,32位则默认DX存放高16位,AX存放低16位;
被除数位8位,默认AL存放商,AH存放余数,16位则AX存放商,DX存放余数。
div bx 将dx*10000H+ax除bx,商放在ax,余数放在dx
div bl 将ax除bl,商放在al,余数放在ah
7、DX、AX用于乘法:
8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。
16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。
8、in和out指令只能使用ax或al来存放从端口中读入或发送的数据。
in al,60h 从60h端口读入一个字节
out 20h,al 往20h端口写入一个字节
9、flag标志寄存器,8086CPU中,各位含义:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
第0位:CF,进位标志位,无符号运算时,记录结果的最高有效位向更高位进位或从最高位的借位值;
第11位:OF,溢出标志位,有符号运算时,结果发生溢出则OF=1;否则OF=0;
第2位:PF,奇偶标志位,记录指令执行后,结果的二进制位中1的个数是否为偶数,是偶数则PF=1,为奇数则PF=0;
第6位:ZF,零标志位,记录指令执行后,结果是否为0,为0则ZF=1;不为0则ZF=0;
第7位:SF,符号标志位,记录指令执行后,结果是否为负,为负则SF=1;不为负则SF=0;
第10位:DF,方向标志位,串处理指令中,控制每次操作后,si,di的增减,DF=0,每次操作后si,di递增;DF=1,则递减;
第9位:IF,CPU响应中断标记,CPU检测到可屏蔽中断信息时,如果IF=1,则响应中断,如果IF=0,则不响应。
标志寄存器在debug中式单独标示的:
标志 值为1的标记 值为0的标记
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
三、指令
1、mov: mov ax,bx 将bx赋值给ax
2、add: add ax,bx 将bx累加到ax
3、sub: sub ax,bx 将ax减去bx,保存到ax
4、div: div bx 将dx*10000H+ax除bx,商放在ax,余数放在dx
5、inc: inc bx 将bx自增1
6、and: and al,11011111b 将al逻辑与11011111b,结果保存在al
7、or: or al,11011111b 将al逻辑或11011111b,结果保存在al
8、ptr: add word ptr [bx],2 对bx开始的内存做字操作
inc byte ptr [bx] 对bx开始的内存做字节操作
有寄存器参与的表达式,由寄存器决定操作长度:add ax,[bx] / add al,[bx]
9、伪指令db、dw、dd分别代表定义立即数类型为字节、字、双字:
db 1 data:0 = 01h 占一个字节
dw 1 data:0 = 0001h 占一个字
dd 1 data:0 = 00000001h 占两个字
10、伪指令dup表示立即数重复次数,配合db、dw、dd使用:
db 3 dup(0) 定义三个字节都是0,即db 0,0,0
db 3 dup(0,1,2) 定义9个字节,即db 0,1,2,0,1,2,0,1,2
11、操作符offset:
start:mov ax,offset start 相当于mov ax,0 offset操作符取得标号start的偏移地址0
s:mov ax,offset s 相当于mov ax,3
12、jmp指令:可以只修改IP,也可以同时修改CS和IP
jmp short s 短转移,只修改IP:-128~127 机器码包含位移
jmp near ptr s 段内近转移,只修改IP:-32768~32767 机器码包含位移
jmp far ptr s 段间近转移,修改CS和IP 机器码明确包含了CS地址和IP地址
jmp al:将al赋值给IP
jmp word ptr ds:[0]:将内存地址0处的一个字赋给IP
13、jcxz指令:条件转移指令,都是短转移,只修改IP:-128~127
jcxz s:如果CX寄存器为0,则转移到s处。
14、loop指令为循环指令,所有循环指令都是短转移。机器码包括位移而不是目的地址
loop s:如果CX--后不为0,则转移到s处
15、ret指令用栈中的数据修改IP,实现近转移,相当于POP IP;
retf指令用栈中数据修改CS和IP内容,实现远转移,相当于POP IP;POP CS;
16、call指令执行以下两步操作,不能实现短转移,其他合jmp指令相同:
1)将当前的IP或者CS和IP压栈
2)转移
用法包括:
1)call 标号:将当前IP压栈后,转移到标号处执行,相当于
PUSH IP
jmp near ptr 标号
2)call ax:类似1
3)call word ptr [bx]:类似1
4)call dword ptr [bx]:段间转移,相当于
push CS
push IP
jmp dword ptr [bx]
17、mul乘法指令:
8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。
16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。
mul reg
mul byte ptr ds:[0]
mul word ptr [bx+si+8]
举例:
mov al,1000
mov bl,10
mul bl
结果:ax = 1000
18、adc指令:带进位加法指令
adc ax,bx 相当于ax=ax+bx+CF
19、sbb指令:借位减法指令
sbb ax,bx 相当于ax = ax-bx-CF
20、cmp指令:比较指令,做减法运算,不保存结果,只影响标志寄存器
mov ax,8
mov bx,3
cmp ax,bx
执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0
cmp ax,bx比较无符号数各种可能:
ZF=1 说明ax=bx
ZF=0 说明ax!=bx
CF=1 说明ax<bx
CF=0 说明ax>=bx
CF=0 && ZF=0 说明ax>bx
CF=1 || ZF=1 说明ax<=bx
cmp ah,bh比较有符号数各种可能:
ZF=1 说明ah=bh
ZF=0 说明ah!=bh
SF=1 && PF=0 说明ah<bh
SF=1 && OF=1 说明ah>bh
SF=0 && OF=1 说明ah<bh
SF=0 && OF=0 说明ah>=bh
21、其他条件转移指令:
je 等于则转移 ZF=1
jne 不等于则转移 ZF=0
jb 低于则转移 CF=1
jnb 不低于则转移 CF=0
ja 高于则转移 CF=0 且 ZF=0
jna 不高于则转移 CF=1 或 ZF=1
22、movsb:将di:si指向的内存字节送入es:di,然后根据DF位标记,将si和di递增或递减
movsw:传送的是字,然后si和di递增或递减2
rep movsb/w:rep指令根据cx的值,重复指向后面的串传送指令,相当于:
s: movsb/w
loop s
cld:将标志寄存器DF位置0
std:将标志寄存器DF位置1
23、pushf:将标志寄存器的值压栈
popf:从栈中弹出数据,送入标志寄存器
24、shl和shr逻辑移位指令
shl逻辑左移指令(shr类似):
1)将一个寄存器或内存单元中的数据向左移位
2)将最后移出的一位写入CF中
3)最低位用0补充
mov al,01001000b
shl al,1
执行后al=10010000b,CF=0
如果移动位数大于1,必须将位数放在cl中。
mov al,01001000b
mov cl,3
shl al,cl
执行后al=10001000b,CF=1
25、in、out指令。
CPU最多可以定位64K个不同端口,即0~65535。
对端口的读写不能使用mov指令,只能使用:in和out。
in和out指令只能使用ax或al来存放从端口中读入或发送的数据。
对0~255以内端口读写:
in al,20h 从20h端口读入一个字节
out 20h,al 从20h端口写入一个字节
对256~65535的端口读写,端口号放在dx中:
mov dx,3f8h
in al,dx
out dx,al
26、sti、cli指令
sti 用于设置IF=1
cli 用于设置IF=0
四、中断
1、8086CPU的中断向量表固定在:0000:0000到0000:03E8的1000个单元中一个表项占用两个字,高地址字存放段地址,低地址字存放偏移地址
2、8086CPU的中断过程:
1)从中断信息中取得中断类型码 :取得中断类型码N
2)标志寄存器的值入栈 :pushf
3)设置标志寄存器的第8位TF和第9位IF的值为0 :TF=0,IF=0(禁止其他可屏蔽中断)
4)CS的内容入栈 :push CS
5)IP的内容入栈 :push IP
6)从内存地址为 中断类型码*4 和 中断类型码*4+2 的两个字单元中读取中断处理程序入口地址设置IP和CS :IP=N*4 , CS=N*4+2
3、中断处理程序常规步骤:
1)保存用到的寄存器
2)处理中断
3)恢复用到的寄存器
4)用iret指令返回,iret指令用汇编语法描述为:
pop IP
pop CS
popf
4、CPU执行int n指令,相当于引发一个N号中断的中断过程,参考2
5、BOIS和DOS中断例程的安装过程:
1)开机后,CPU一加电,初始化CS=0FFFFH,IP=0,自动从FFFF:0单元开始执行程序。此处有一条跳转指令,CPU执行该指令后,转去执行
BOIS中的硬件系统检测和初始化程序。
2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中,注意,对于BIOS所提供的中断例
程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。
3)硬件检测和初始化完成后,调用int 19h进行操作系统的引导,从此将计算机交由操作系统控制。
4)DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
6、外中断,包括两类:
1)可屏蔽中断:IF=1,响应中断,IF=0,不响应中断
几乎所有的外设引发的中断,都是可屏蔽中断。
sti 用于设置IF=1
cli 用于设置IF=0
2)不可屏蔽中断
CPU必须响应,中断类型码固定为2,因此中断过程第一步,不需要取中断类型码了。
00000000b~01111111b表示0~127,按位取反后加1表述负数:
00000000b:0 11111111b+1=00000000b:0
00000001b:1 11111110b+1=11111111b:-1
00000010b:2 11111101b+1=11111110b:-2
01111111b:127 10000000b+1=10000001b:-127
结论:
1)最高位为1,表示负数
2)正数补码取反加1后为负数的补码;负数的补码取反加1后位其绝对值。比如:
1的补码位00000001b,取反加1后位:11111111b,表示-1
-1的补码位11111111b,取反加1后位:00000001b,其绝对值位1
利用此特性可以得知负数补码代表什么数值
二、寄存器
1、CS为指令段寄存器;IP为指令指针寄存器;CS:IP(CS*16+IP)为指令地址
不可使用mov指令直接修改寄存器值,可使用jmp指令:jmp 2Ae3:3 同时修改CS和IP;jmp ax 单独修改IP
2、DS为内存数据寄存器;ds设值后,[bx]取指定索引数据;或者DS:[bx]
不可mov一个立即数给它,使用mov bx,1000h; mov ds,bx来赋值
ES指向附加段,和DS功能相同,都可访问内存,特殊情况:进行串操作时,目的地址的段寄存器规定为ES。
3、SS为栈段寄存器;SP为栈指针寄存器;SS:SP(SS*16+SP)指向栈顶元素
PUSH:SP=SP-2后入栈
POP ax:SS:SP数据取到ax,SP+=2;
PUSH、POP可以对段寄存器做操作
4、BX、SI、DI、BP,只有这四个寄存器可以存放内存索引:
mov ax,[si]
mov ax,[bx+si]
mov ax,[si+idata]
组合情况只有四种:bx+si;bx+di;bp+si;bp+di
使用到BP寄存器,默认段在SS中;其他默认DS中。
5、CX存放循环次数:
mov cx,12
s: add dx,ax
loop s
存储条件转移指令的条件:
jcxz s
6、DX、AX默认存放除数:
除数16位则默认放AX,32位则默认DX存放高16位,AX存放低16位;
被除数位8位,默认AL存放商,AH存放余数,16位则AX存放商,DX存放余数。
div bx 将dx*10000H+ax除bx,商放在ax,余数放在dx
div bl 将ax除bl,商放在al,余数放在ah
7、DX、AX用于乘法:
8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。
16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。
8、in和out指令只能使用ax或al来存放从端口中读入或发送的数据。
in al,60h 从60h端口读入一个字节
out 20h,al 往20h端口写入一个字节
9、flag标志寄存器,8086CPU中,各位含义:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
第0位:CF,进位标志位,无符号运算时,记录结果的最高有效位向更高位进位或从最高位的借位值;
第11位:OF,溢出标志位,有符号运算时,结果发生溢出则OF=1;否则OF=0;
第2位:PF,奇偶标志位,记录指令执行后,结果的二进制位中1的个数是否为偶数,是偶数则PF=1,为奇数则PF=0;
第6位:ZF,零标志位,记录指令执行后,结果是否为0,为0则ZF=1;不为0则ZF=0;
第7位:SF,符号标志位,记录指令执行后,结果是否为负,为负则SF=1;不为负则SF=0;
第10位:DF,方向标志位,串处理指令中,控制每次操作后,si,di的增减,DF=0,每次操作后si,di递增;DF=1,则递减;
第9位:IF,CPU响应中断标记,CPU检测到可屏蔽中断信息时,如果IF=1,则响应中断,如果IF=0,则不响应。
标志寄存器在debug中式单独标示的:
标志 值为1的标记 值为0的标记
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
三、指令
1、mov: mov ax,bx 将bx赋值给ax
2、add: add ax,bx 将bx累加到ax
3、sub: sub ax,bx 将ax减去bx,保存到ax
4、div: div bx 将dx*10000H+ax除bx,商放在ax,余数放在dx
5、inc: inc bx 将bx自增1
6、and: and al,11011111b 将al逻辑与11011111b,结果保存在al
7、or: or al,11011111b 将al逻辑或11011111b,结果保存在al
8、ptr: add word ptr [bx],2 对bx开始的内存做字操作
inc byte ptr [bx] 对bx开始的内存做字节操作
有寄存器参与的表达式,由寄存器决定操作长度:add ax,[bx] / add al,[bx]
9、伪指令db、dw、dd分别代表定义立即数类型为字节、字、双字:
db 1 data:0 = 01h 占一个字节
dw 1 data:0 = 0001h 占一个字
dd 1 data:0 = 00000001h 占两个字
10、伪指令dup表示立即数重复次数,配合db、dw、dd使用:
db 3 dup(0) 定义三个字节都是0,即db 0,0,0
db 3 dup(0,1,2) 定义9个字节,即db 0,1,2,0,1,2,0,1,2
11、操作符offset:
start:mov ax,offset start 相当于mov ax,0 offset操作符取得标号start的偏移地址0
s:mov ax,offset s 相当于mov ax,3
12、jmp指令:可以只修改IP,也可以同时修改CS和IP
jmp short s 短转移,只修改IP:-128~127 机器码包含位移
jmp near ptr s 段内近转移,只修改IP:-32768~32767 机器码包含位移
jmp far ptr s 段间近转移,修改CS和IP 机器码明确包含了CS地址和IP地址
jmp al:将al赋值给IP
jmp word ptr ds:[0]:将内存地址0处的一个字赋给IP
13、jcxz指令:条件转移指令,都是短转移,只修改IP:-128~127
jcxz s:如果CX寄存器为0,则转移到s处。
14、loop指令为循环指令,所有循环指令都是短转移。机器码包括位移而不是目的地址
loop s:如果CX--后不为0,则转移到s处
15、ret指令用栈中的数据修改IP,实现近转移,相当于POP IP;
retf指令用栈中数据修改CS和IP内容,实现远转移,相当于POP IP;POP CS;
16、call指令执行以下两步操作,不能实现短转移,其他合jmp指令相同:
1)将当前的IP或者CS和IP压栈
2)转移
用法包括:
1)call 标号:将当前IP压栈后,转移到标号处执行,相当于
PUSH IP
jmp near ptr 标号
2)call ax:类似1
3)call word ptr [bx]:类似1
4)call dword ptr [bx]:段间转移,相当于
push CS
push IP
jmp dword ptr [bx]
17、mul乘法指令:
8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。
16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。
mul reg
mul byte ptr ds:[0]
mul word ptr [bx+si+8]
举例:
mov al,1000
mov bl,10
mul bl
结果:ax = 1000
18、adc指令:带进位加法指令
adc ax,bx 相当于ax=ax+bx+CF
19、sbb指令:借位减法指令
sbb ax,bx 相当于ax = ax-bx-CF
20、cmp指令:比较指令,做减法运算,不保存结果,只影响标志寄存器
mov ax,8
mov bx,3
cmp ax,bx
执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0
cmp ax,bx比较无符号数各种可能:
ZF=1 说明ax=bx
ZF=0 说明ax!=bx
CF=1 说明ax<bx
CF=0 说明ax>=bx
CF=0 && ZF=0 说明ax>bx
CF=1 || ZF=1 说明ax<=bx
cmp ah,bh比较有符号数各种可能:
ZF=1 说明ah=bh
ZF=0 说明ah!=bh
SF=1 && PF=0 说明ah<bh
SF=1 && OF=1 说明ah>bh
SF=0 && OF=1 说明ah<bh
SF=0 && OF=0 说明ah>=bh
21、其他条件转移指令:
je 等于则转移 ZF=1
jne 不等于则转移 ZF=0
jb 低于则转移 CF=1
jnb 不低于则转移 CF=0
ja 高于则转移 CF=0 且 ZF=0
jna 不高于则转移 CF=1 或 ZF=1
22、movsb:将di:si指向的内存字节送入es:di,然后根据DF位标记,将si和di递增或递减
movsw:传送的是字,然后si和di递增或递减2
rep movsb/w:rep指令根据cx的值,重复指向后面的串传送指令,相当于:
s: movsb/w
loop s
cld:将标志寄存器DF位置0
std:将标志寄存器DF位置1
23、pushf:将标志寄存器的值压栈
popf:从栈中弹出数据,送入标志寄存器
24、shl和shr逻辑移位指令
shl逻辑左移指令(shr类似):
1)将一个寄存器或内存单元中的数据向左移位
2)将最后移出的一位写入CF中
3)最低位用0补充
mov al,01001000b
shl al,1
执行后al=10010000b,CF=0
如果移动位数大于1,必须将位数放在cl中。
mov al,01001000b
mov cl,3
shl al,cl
执行后al=10001000b,CF=1
25、in、out指令。
CPU最多可以定位64K个不同端口,即0~65535。
对端口的读写不能使用mov指令,只能使用:in和out。
in和out指令只能使用ax或al来存放从端口中读入或发送的数据。
对0~255以内端口读写:
in al,20h 从20h端口读入一个字节
out 20h,al 从20h端口写入一个字节
对256~65535的端口读写,端口号放在dx中:
mov dx,3f8h
in al,dx
out dx,al
26、sti、cli指令
sti 用于设置IF=1
cli 用于设置IF=0
四、中断
1、8086CPU的中断向量表固定在:0000:0000到0000:03E8的1000个单元中一个表项占用两个字,高地址字存放段地址,低地址字存放偏移地址
2、8086CPU的中断过程:
1)从中断信息中取得中断类型码 :取得中断类型码N
2)标志寄存器的值入栈 :pushf
3)设置标志寄存器的第8位TF和第9位IF的值为0 :TF=0,IF=0(禁止其他可屏蔽中断)
4)CS的内容入栈 :push CS
5)IP的内容入栈 :push IP
6)从内存地址为 中断类型码*4 和 中断类型码*4+2 的两个字单元中读取中断处理程序入口地址设置IP和CS :IP=N*4 , CS=N*4+2
3、中断处理程序常规步骤:
1)保存用到的寄存器
2)处理中断
3)恢复用到的寄存器
4)用iret指令返回,iret指令用汇编语法描述为:
pop IP
pop CS
popf
4、CPU执行int n指令,相当于引发一个N号中断的中断过程,参考2
5、BOIS和DOS中断例程的安装过程:
1)开机后,CPU一加电,初始化CS=0FFFFH,IP=0,自动从FFFF:0单元开始执行程序。此处有一条跳转指令,CPU执行该指令后,转去执行
BOIS中的硬件系统检测和初始化程序。
2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中,注意,对于BIOS所提供的中断例
程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。
3)硬件检测和初始化完成后,调用int 19h进行操作系统的引导,从此将计算机交由操作系统控制。
4)DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
6、外中断,包括两类:
1)可屏蔽中断:IF=1,响应中断,IF=0,不响应中断
几乎所有的外设引发的中断,都是可屏蔽中断。
sti 用于设置IF=1
cli 用于设置IF=0
2)不可屏蔽中断
CPU必须响应,中断类型码固定为2,因此中断过程第一步,不需要取中断类型码了。