type
status
date
slug
summary
tags
category
icon
password
汇编语言:
1、简单概述:
汇编语言的组成:

1、汇编指令(核心) :机器码的助记符
2、伪指令 :由编译器执行
3、其他符号: 由编译器执行
存储器:
在pc中内存的作用仅次于cpu
作用结结构:
磁盘的数据传入内存,然后CPU和内存进行交互
地址总线的宽度决定了CPU的寻址能力;
数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;
控制总线的宽度决定了CPU对系统中其他器件的控制能力
2、寄存器(CPU工作原理)
1、通用寄存器:
AX,BX,CX,DX等等
2\字在寄存器中的存储:
一个字可以存在一个16位寄存器中,这样这个字的高位字节和低位字节自然就存在寄存器的高位和低位。
一个字等于2个字节:Word=2B=16位
3、物理地址:
相当于是一个一维数组的空间
4、地址加法器工作原理:
物理地址=段地址*16+偏移地址
物理地址=基地址+偏移地址
一个X进制数左移一位相当于这个数*X
5、段地址:
段地址是人为定义的,一段地址你可以指定它分为几个段,只要能够找到他的物理地址就行
偏移地址为16位,16为地址的寻址能力为64K,所以这一个段的地址长度最大为64K
6、段寄存器:
8086CPU有4个段寄存器,用来提供段地址
CS,DS,SS,ES
代码段,数据段,堆栈段,附加段
CS:代码段寄存器
IP:指令指针寄存器
修改CS、IP的指令“
mov指令可以修改通用寄存器的值,但是无法修改段寄存器的值,但是可以使用JMP来修改CS、IP的值
格式:jmp 段地址:偏移地址
同时也可以仅修改IP的内容:
jmp 某一合法寄存器 用寄存器的值修改IP
实验一:DeBug
debug命令:
R命令查看、改变CPU寄存器的内容
D命令查看内存中的内容
E命令改写内存中的内容
U命令将内存中的机器指令翻译成汇编指令
T命令执行一条机器指令
A命令一汇编指令的格式在内存中写入一条机器指令
3、寄存器(内存访问):
DS和[address]
对于8086CPU,不支持将数据直接送入段寄存器,ds是一个段寄存
正确的应该是
[address]相当于是一个偏移地址
栈
工作方式:先进后出
压栈和出栈:push 寄存器和pop寄存器
8086CPU的压栈和出栈都是以字为单位进行的
一、CPU是如何知道当前要执行的指令所在的位置:
答:寄存器CS和IP中存放着当前指令的段地址和偏移地址
8086CPU中有两个寄存器:
段寄存器SS 存放栈顶的段地址
寄存器SP 存放栈顶的偏移地址
任意时刻,SS:SP指向栈顶元素
二、push和pop还可以对内存单元进行压栈和出栈
指令执行时,CPU要知道内存单元的地址,可以在push和pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得
执行push时:
先改变SP,后向SS:SP处传送
执行pop时:
先读取SS:SP处的数据,后改变SP
8086CPU只记录栈顶,栈空间的大小我们要自己管理
push和pop操作改变的是SP偏移地址的值
4、第一个程序:
1、汇编指令
2、伪指令:伪指令没有对应的机器码,它是由编译系统进行编译
例如: XXX segment
XXX ends
上面的一对伪指令叫做 定义一个段
segment和ends是一对成对使用的伪指令,这是在写可悲编译器编译的汇编程序是,必须用到的一对伪指令,一个开始一个结束
格式: 段名 segment
断名 ends
3、end表示程序真正的结束,还可以表示编译器程序的入口在哪(需添加start)
4、assume:翻译为 假设 他假设某一段寄存器和程序的某一个用segment...ends定义的段相关联,同时也让计算机知道你接下来编写的是一个代码段,cs
标号:标记一个段的地址
5、[BX]和loop指令
1、[bx]是指将通用寄存器bx的值作为偏移地址来使用
[bx]作为偏移地址与DS配合
意思就是将[bx]地址处的值给ax,而不是将bx给ax
注意:上面的代码是针对调试器而言的,对于其MASM而言,其作用就是将0赋值给ax,而不是将偏移地址0处的数据传给ax
2、loop指令与cx紧密相连,cx是指计数寄存器,相当于一些高级语言退出循环时的条件
此处的s是标号,意思是将循环指向s处,标号代表一个地址,代表一个循环开始的地址
loop指向时,首先将cx-1,然后执行循环体
在汇编程序中,数据不能够以字母开头,所以要在前面加上0
6、包含多个段的程序:
1、在代码段中使用数据:
dw的含义是定义字型数据,即define word
还有一点就是此处的start,在此处添加start函数的目的是为了让代码从此处开始运行,因为这些代码是放在cs代码段中,如果不设置start,那么机器就有可能将上面dw定义的数据当做代码执行,从而引发错误,同时还要在end后面添加start
2、在代码段中使用栈:
3、将数据、代码、栈放入不同的段
7、更灵活的定位内存地址的方法:
1、and和or指令:
and指令:逻辑与指令,按位与运算
通过该指令可将错做对象的响应位设为0,其他位不变
有0为0
or:指令:逻辑或指令,按位或运算
可以将可操作对象的操作位设为1
有1为1
2、ASCII码:
上面就是将一些字符写入的程序,使用db就可以满足要求
对于上面的字符大小写转换,不仅可以使用加减进行转换,还可以使用上面的and和or运算得到
3、[bx+idata]:
写法及意义:
[bx+idata]事实上也就是一种偏移地址的写法,意思是物理地址=ds*16+bx+idata
使用[bx+idata]的方式进行数组的处理:
SI和DI:
SI和DI在8086中和bx功能相近的寄存器,但是SI和DI不能分为两个8位寄存器使用
下面的代码作用相同:
也适用于上面的[bx+idata]格式:
[bx+si]和[bx+di]实现更加简洁到方式:
意思就是将偏移地址为bx和si的值相加的和为偏移地址
[bx+si+idata]和[bx+di+idata]:
不同的寻址方式地灵活应用:
联合栈使用可以实现双重循环的效果
8、数据处理的两个基本问题:
1、处理的数据在哪:
2、处理的数据有多长
reg:寄存器
sreg:段寄存器
【】的使用与四个寄存器的组合:
在8086中,[]只能与 bx,si,di,bp配合使用。其中bx和bp,si和di不能同时使用
bp的使用:
bp相当于是一个相对地址,如果指令中没有显性的给出段地址,段地址就默认在ss中,比如:
第一个问题:
指令执行前,索要处理的数据可以在三个地方出现:
CPU内部、内存、端口
汇编语言中三个概念来比表达数据的位置:
1、立即数(idata) mov ax,1
2、寄存器 mov ax,bx
3、段地址(SA)和偏移地址(EA)
只有bp才默认段地址是ss,其他是ds
第二个问题:
8086CPU的指令,可以处理两种尺寸的数据,byte和word,所以要指明指令是字操作还是字节操作
三种方法判断指令处理的数据有多长:
1、通过寄存器指明要处理的数据的尺寸:ax是16位,al是8位
2、在没有寄存器名存在的情况下,用操作符X.ptr指明内存单元的长度,X在汇编指令中可以为word或byte
3、其他方法
有些指令默认了访问的事子单元还是字节单元
如push和pop操作字单元
寻址方式地综合应用:
与高级语言结构类似
div指令:
div是除法指令(division),使用div作除法的时候:
除数:8位或者16位,在寄存器或内存单元中
被除数:(默认)放在AX或DX和AX中
除数 被除数
5位 16位(AX)
16位 32位(DX+AX)
div格式:
1、div reg
2、div 内存单元
示例:
伪指令dd
dd是用来定义dword(double word)双字型数据
伪指令dup
dup是一个操作符,是由编译器识别处理的符号,它是由db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复
使用格式:
db/dw/dd 重复的次数 dup (重复的字节型数据)
转移指令的原理:
1、操作符offest:
操作符offest在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址。
2、jmp指令:
jmp为无条件转移,可以值修改IP,也可以同时修改CS和IP;
jmp指令要给出两种信息:
转移的目的地址
转移的距离(段间转移、段内短转移、段内进转移)
1、jmp short 标号(转到标号处执行指令)
解释:这种格式的jmp指令实现的事段内短转移,他对IP的修改范围为-128·~127,也就是说他向前可以越过128个字节,向后可以最对越过127个字节
但是在机器码中,对于jmp指令,他并没有对其写明要转移的目的地址,也就是说CPU不需要这个目的地址既可以实现对IP的修改
执行过程:
1、读取指令:CS=0BBDH,IP=0006,CS:IP指向EB 03(jmp short s的机器码)03指的是中间需要跳过的字节码的长度即偏移地址
2、读取指令码EB 03进入指令缓冲器;
3、IP=IP+所读取指令的长度=IP+2=0008,CS:IP指向add ax,1
4、CPU执行指令缓冲器中的指令EB 03
5、指令EB 03执行后,IP=000BH=0008+3,CS:ip指向inc ax
2、jmp near ptr 标号
它实现的是段内近转移
IP=IP+16位位移
他的·1范围是-32769~32767
和上面的类似
3、jmp far ptr 标号
功能是far ptr指明了指令用标号的段地址和偏移地址修改了CS和IP
对于远转移,他的机器码给出了要跳转的地址
也就是EA (IP)(CS)
4、jmp 寄存器
IP=寄存器的值
5、转移地址在内存中的jmp指令
jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始放着一个字,是转移的目的偏移地址
jmp dword ptr 内存单元地址
3、jcxz指令:
jcxz指令为有条件的转移指令,所有有条件·的转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,对IP的修改范围都是-128~127
格式:jcxz 标号
如果cx=0,则转移到标号处执行
4、loop指令:
9、Call和Ret指令:
call和ret指令都是转移指令,他们都修改IP,或痛死修改CS金额IP
1、ret和retf:
1、ret指令使用栈中的数据,修改IP的内容,从而实现近转移
CPU执行ret指令时,进行下面两部操作:
1、IP=ss*16+sp
2、sp=sp+2
相当于执行了pop IP
2、retf指令使用栈中的数据,修改CS和IP的内容,从而实现远转移
CPU执行retf指令时,进行下面两步操作:
1、IP=ss*16+sp
2、sp=sp+2
3、CS=ss*16+sp
4、sp=sp+2
相当于执行了pop IP pop CS
2、call指令
call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
1、将当前的IP或者IP和CS压入栈
2、jmp转移
call指令不能实现短转移
进行下面的两部操作:
1、 sp=sp-2
ss*16+sp=IP
2、 IP=IP+16位位移
16位位移=标号处的·地址-call执行后的第一个字节的地址
3、call far ptr
4、call 寄存器
5、call和ret的配合:
一个call对应一个ret,但是可以使用嵌套call和rret
6、mul乘法指令:
1、相乘的两个数,要么都是8为,要么都是16位
格式:
mul reg
mul 内存单元:
7、批量数据的传递:
1、使用寄存器
2、使用内存
3、使用栈
dec:自减1,与inc相反
10、标志寄存器:
8086CPU的标志寄存器:
1、ZF标志位:
指令结束后,结果为0,那么ZF为1
mov,push,pop不会影响ZF
2、PF标志位:
奇偶标志位
他记录指令执行后,结果的所有二进制位中1的个数
如果是偶数,PF=1
如果是奇数,PF=0
3、SF标志位
他记录指令执行后,结果如果为负,SF=1
结果如果是正,SF=0
记录数据的正负,他按照负数进行计算
4、CF标志位
进位标志位
他记录着结果的最高有效位的进位值,或从更高位的借位
inc 和loop不会影响标志寄存器
5、OF标志位
在进行有符号数运算时,如果结果超过了机器所能表示的范围的时候称为溢出
adc指令:
adc指令是带进位加法指令,他利用了CF位上记录的进位值
格式: adc 操作对象1,操作对象2
功能: 操作对象1=操作对象2+CF
adc ax,bx
ax=ax+bx+CF
sbb指令:
sbb是带借位减法指令,他利用CF位上记录的借位值
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
比如: sbb ax,bx
功能: ax=ax-bx-CF
cmp指令:
比较指令,相当于减法指令,只是不保存结果
cmp指令执行后,将对标志寄存器产生影响
通过做减法来影响标志寄存器
条件转移指令:
6、DF标志位和串传送指令
格式:movsb
功能:以字节为单位传送
1、es* 16+di=ds *16+si
2、如果DF=0:
si=si+1
di=di+1
如果DF=1:
si=si-1
di=di-1
movsb的功能就是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di的值进行递增或者递减
也可以传送一个字 movsw 然后加减2
一般movsb和movsw都和rep配合使用,格式:
rep movsb
rep的作用是根据cx的值,重复执行后面的串传送指令
由于是根据DF的值进行传送方向,所以有两个指令可以对DF进行设置
cld指令:将标志寄存器的DF位置为0
std指令:将标志寄存器的DF位置为1
pushf和popf
pushf:将标志寄存器的值压栈
popf:从栈中弹出数据,送入标志寄存器中
11、内中断
概述
中断是CPU处理外部突发事件的一个重要技术
外部中断一般是由计算机外设发出ed中断请求,如:键盘中断,打印机1中断
内部中断是指因硬件出错,如:突然掉电或者运算出错引起的中断,内部中断是不可屏蔽的中断
软件中断不是真正的中断,他们是可被调用执行的一般程序以及DOS系统功能调用(INT 21H)等都是软件中断
中断优先级:1、除法错、溢出中断、软件中断 2、不可屏蔽中断 3、可屏蔽中断 4、单步中断
中断向量表:
中断向量表就是中断向量的列表,相当于一个索引,对于8086PC机,中断向量表指定放在内存地址0处
从0000:0200到0000:02FF放入256个中断向量表
中断过程:
iret指令功能可描述为:
也就是继续执行之前的活动
一个0号中断代码:
单步中断:
当检测到标志寄存器的TF为1,则产生单步中断,引发中断过程
单步中断地中断类型码为1,泽塔引发的中断过程如下:
1、取得中断类型码为1
2、TF=IF=0
3、CS、IP入栈
4、IP=14 CS=14+2
1号错误类型是显示所有寄存器内容,等待输入
12、int指令
格式:int n,n是类型中断码
引发n号中断的过程:
可以使用int指令调用任何一个中断程序
int 指令和iret指令相互配合
13、端口:
对端口的读写不能使用mov、push、pop等内存读写指令
短裤的读写指令只有两个:in 和 out 分别用于从端口读取数据和往端口写入数据
shl和shr指令:
shl和shr是逻辑移位指令
shl逻辑左移指令,功能是:
1、将一个寄存器或内存单元中的数据向左移位
2、将最后移出的一位写入CF中
3、最低位以0来补充
可以看出,将X逻辑左移一位,相当于执行X=X*2
shr逻辑右移指令,与其相反
执行shr,相当于X=X/2
14、外中断:
由外部设备产生
1、可屏蔽中断:是CPU可以不响应地中断,查看IF是否为1
2、不可屏蔽中断:中断类型码是2,必须响应的中断
8086CPU中提供设置IF的指令是:
sti:用于设置IF=1
cli:用于设置IF=0
int 9 键盘中断码
15、直接定址表:
例如
加 :的标号只能在代码段中使用
a:db 1,2,3,4,5,6,7,8
只能在代码段中使用
seg操作符:功能是取得某一标号的段地址
16、使用BIOS进行键盘输入和磁盘读写:
- Author:xiaowaaa
- URL:https://www.xiaowaaa.asia//article/c33a7e28-7d41-4330-98ff-f30cc44c76da
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!