汇编语言与微机原理 期末半开卷复习整理(上)
创始人
2024-03-17 14:33:07
0

8086CPU寄存器

8086:16位,4.77MHz~10MHz,16根数据线,20根地址线
AX/AL:乘除法指令中用作累加器,IO指令中用作数据寄存器,可显式或隐含调用
AH:在LAHF用作目的寄存器,隐含调用。
AL:在BCD码用做累加器,隐含调用。
BX:在存储器寻址用作地址/基址寄存器,显式调用。在XALT用作基址寄存器,隐含调用
CX:循环计数器,隐含
CL:在移位、循环移位中用作移位次数,显式
DX:在I/O指令用作地址寄存器,显式调用。在乘除法用作辅助累加器,隐含调用
BP:堆栈段基址寄存器,显式。
SP:堆栈指针,隐含
SI:字符串操作源地址寄存器,隐含。存储器寻址用作地址寄存器,显式。
DI:字符串操作目的变址寄存器,隐含。存储器寻址用作地址寄存器,显式。
CS:代码段寄存器。
SS:堆栈段
DS:数据段
ES:附加段
IP:即将执行的指令的偏移地址,不能读/显式设定
PSW

15~1211109876543210
OFDFIFTFSFZFAFPFCF
overflow指针方向中断单步signzero辅助进位最低位字节“1“个数carry
IF=1,允许中断TF=1,单步低4位对高四位进位为偶数时PF=1

CLI/STI:执行CLI,IF=0。执行STI,IF=1。
存储空间:按字节编址,2202^{20}220=1MB寻址空间,00000H~FFFFFH,小端存储(低位低字节,高位高字节)。段:0000H~FFFFH(64KB),每个逻辑段最大64KB。
物理地址:物理地址=段地址:偏移地址。物理地址=段地址*16+偏移地址,各段可能重叠
:CS:IP为即将执行的指令,SS:SP为栈顶,DS:EA为数据段,ES:EA为附加段。

8086的控制与时序

引脚:MN/MX‾MN/\overline{MX}MN/MX为工作模式,接+5V为最小模式。最大模式可接8087/8089等协处理器。控制由总线控制器8288提供。接地为最大模式,不含协处理器。
RST:复位,高有效
Ready:就绪,输入,高有效。
AD15~AD0:地址/数据复用信号,地址三态输出,数据三态双向。
M/IO‾M/\overline{IO}M/IO:三态,选内存/外设。
RD‾\overline{RD}RD:三态,低有效,读
WR‾\overline{WR}WR:三态,低有效,写
ALE:输出,地址锁存允许,正脉冲下降沿锁存地址。
DT/R‾DT/\overline{R}DT/R:三态输出,=1时发送数据,=0时接收数据。
DEN‾\overline{DEN}DEN:三态低有效,表明AD15~AD0在传数据。
**BHE‾/S7\overline{BHE}/S_7BHE/S7​:三态输出,分时复用,为0时,D15D_{15}D15​~D8D_8D8​位有效
S6S5:S6=0,S5=IF
A19A_{19}A19​~A16A_{16}A16​/S6S_6S6​~S3S_3S3​:地址状态复用
S4S3S_4S_3S4​S3​:段。00ES,01SS,10CS,11DS
D15D_{15}D15​~D8D_8D8​连奇体,D7D_7D7​~D0D_0D0​连偶体。从奇地址读一个字,需要2个总线周期。

BHE‾\overline{BHE}BHEA0A_0A0​
00从偶读字,AD15AD_{15}AD15​~A0A_0A0​
01从奇读字节,AD15AD_{15}AD15​~D8D_8D8​
10从偶读字节,AD7AD_{7}AD7​~D0D_0D0​
11高阻

总线形成:8284时钟、3个8282地址锁存,2个8286数据收发,直接提供控制。
INTR输出高有效,IF=1时相应中断请求。
INTA‾\overline{INTA}INTA输出,中断响应
NMI输入,上升沿有效,不可屏蔽中断请求。
输出:AD15AD_{15}AD15​~AD0AD_0AD0​,A19/S6A_{19}/S_6A19​/S6​~A16/S3A_{16}/S_3A16​/S3​时,20位地址被3片8282锁存,并锁存BHE‾\overline{BHE}BHE.
8286T与DT/R‾DT/\overline{R}DT/R相连,OE‾\overline{OE}OE与DEN‾\overline{DEN}DEN相连,允许数据通过。
三种周期:时钟周期、总线周期、指令周期(多个总线)

总线读周期

在这里插入图片描述
执行MOV AX,[BX]
T1T_1T1​:M/IO‾M/\overline{IO}M/IO变高,对内存操作。A19A_{19}A19​~A0A_0A0​地址信号,BHE‾/S7\overline{BHE}/S_7BHE/S7​变低)(数据高8位有效),ALE正脉冲,DT/R‾DT/\overline{R}DT/R变低(数据收发器接收)
T2T_2T2​:A19A_{19}A19​~A16A_{16}A16​状态信号,AD15AD_{15}AD15​~AD0AD_0AD0​高阻,RDRDRD低(读内存),DEN‾\overline{DEN}DEN低(允许收发器传送)
T3T_3T3​:AD15AD_{15}AD15​~AD0AD_0AD0​出现数据
T4T_4T4​:RD‾\overline{RD}RD高,CPU读。DEN‾\overline{DEN}DEN高,收发器与总线断开。

总线写周期

在这里插入图片描述
执行MOV[DI],BL(写8位而不是16位)
T1T_1T1​:DT/R‾DT/\overline RDT/R变高,数据收发器发,BHE‾/S7\overline{BHE}/S_7BHE/S7​高,高8位无效(与网上找的图有区别,注意具体问题具体分析)
T2T_2T2​:WR‾\overline{WR}WR低,CPU将写。AD15AD_{15}AD15​~AD8AD_8AD8​变高阻,DEN‾\overline{DEN}DEN低(T2T_2T2​已经发数据D7D_7D7​~D0D_0D0​),读时T3T_3T3​才有数据区别。
T3T_3T3​:维持不变
等待状态TwT_wTw​:1.在T3T_3T3​前沿检测Ready是否有效。2.若Ready无效,在T3T_3T3​和T4T_4T4​之间插入TwT_wTw​,转1。3.若Ready有效,进入T4T_4T4​
T4T_4T4​:\overline{WR}高,CPU写
其余类似

模板与变量

调试流程:编辑(.asm),汇编(.obj),连接(.exe),执行。
调试debug模式下所有数据16进制。
伪指令:参数是常量、变量名,参数间用逗号分隔
模板:

.model small
.stack 100
.data
;//数据区
.code
start:mov ax,@datamov ds,ax;//逻辑代码mov ax,4c00hint 21h
end start

字符量值为ASCII码
‘0’=30H,‘A’=41H,‘Z’=5AH,‘a’=61H,‘z’=7AH
八进制后缀Q,
符号名 EQU 数值表达式在汇编前就被计算
变量:DB 字,DW 字节,DD 双字,DQ 8byte,DT 10byte
重复次数 dup (重复内容)

指令

寻址

指令格式:op dst src
立即寻址:操作数在指令中
寄存器寻址:用作dst,src,除了IP、PSW,都可以寄存器寻址。CS不能为dst
存储器寻址:dst和src不能同为存储器寻址
直接寻址:EA=8/16位位移量,例如:MOV AX,[2000H]
寄存器间接寻址:EA=BX/BP/SI/DI。例如:MOV AX,[BX]
寄存器相对寻址:EA=BX/BP/SI/DI+8/16位。例如:MOV AX,06H[SI]
基址变址寻址:EA=BX/BP+SI/DI。例如:MOV AX,[BP][SI]
相对基址变址寻址:EA=BX/BP+SI/DI+8/16位移量
使用BP时,隐含段位SS。其余隐含段为DS。允许段超越。
EA可为数值,可为变量名(符号地址)
在这里插入图片描述
(CS,IP)不为目的操作数。数据类型要一致。
例如,MOV [BX][SI],1错误,类型不明确。
XCHG OPR1_11​ OPR2_22​交换数值(不能同为mem,不能用seg、ip、imm)
XLATAL←\leftarrow←[(BX)+(AL)]
堆栈从较大地址分配使用,向上生长。
PUSH src:SP←\leftarrow←SP-2,((SP)+1,(SP))←\leftarrow←src(不能同为imm),必须16位
POP dstdst←\leftarrow←((SP)+1,(SP)),SP←\leftarrow←SP+2,CS不能为dst
LEA reg,src,reg不为seg,src必须为mem(lea传送地址,mov传送内容)
LDS:reg←\leftarrow←src,dst←\leftarrow←src+2。src:reg,mem,imm。dst:mem,reg
pushf/popf:保存/恢复主程序flag

运算

CBW:AL→\rightarrow→AXCBW:AX→\rightarrow→DX,AX
加减法:OP dst,src,src和dst不能同为reg/为seg
INC不影响CF。
求补:NEG opr(opr←\leftarrow← 0-opr)
乘法:无符号数为MUL src,有符号数为IMUL src,src为reg/mem。为mem时,明确类型用ptr。
在这里插入图片描述
MUL:{CF,OF=00高位为011否则\begin{cases}CF,OF=00&高位为0\\11&否则\end{cases}{CF,OF=0011​高位为0否则​
IMUL:{CF,OF=00高位为低一半符号扩展11否则\begin{cases}CF,OF=00&高位为低一半符号扩展\\11&否则\end{cases}{CF,OF=0011​高位为低一半符号扩展否则​
无符号除:DIV src。有符号除:IDIV src
在这里插入图片描述
NOT不影响flag。其余逻辑运算清零CF/OF,但SF/PF/ZF根据结果设置。
移位:OP dst,src其中src为1或CL。dst为mem且应当指明类型。左移为*2,右移为/2。带进位循环移位可实现高精度。
##在这里插入图片描述

转移

转移:直接寻址(标号)、间接寻址(reg、mem)
JMP short 8位,
JMP 标号:IP←\leftarrow←IP+label相对于当前IP偏移,CS不变
JMP NEAR PTR 标号:16位范围,不包含byte/dword,为word
JMP FAR PTR 标号:IP←\leftarrow←offset next,CS←\leftarrow←seg next
无符号数:JB/JC/JNAE低于,JNB/JAE/JNC高于等于,JBE/JNA低于等于,JNBE/JA高于
有符号数:JL/JNGE小于,JNL/JGE大于等于,JLE/JNG小于等于,JNLE/JG大于
JCXZ CX=0则转移,JE相等,JNE不相等,JP PF=1则转移(1的个数为偶数)
LOOP:只短转移
LOOP opr:CX≠\ne​= 0
LOOPZ opr(ZF=1且CX≠\ne​= 0)
LOOPNZ opr(ZF=0且CX≠\ne​= 0)
LOOP相当于:

DEC CX
JNZ 标号

子程序

CALL子程序名(段内直接调用):SP←\leftarrow←SP-2,(SS:IP)←\leftarrow←IPIP←\leftarrow←子程序
RET(IP)←\leftarrow←(SS:IP)(SP)←\leftarrow←(SP)+2
RET n(IP)←\leftarrow←(SS:IP)(SP)←\leftarrow←SP+2+n
段间调用
call 子程序名
(SP)←\leftarrow←(SP-2)
(SS:SP)←\leftarrow←(CS)
(IP)←\leftarrow←子程序入口
(CS)←\leftarrow←子程序段
(先压段后压偏移)
段间返回
ret
(IP)←\leftarrow←(SS:SP)
(SP)←\leftarrow←(SP)+2
(CS)←\leftarrow←(SS:SP)
(SP)←\leftarrow←(SP)+2
先取偏移后取段
ret n:在csn出栈还会(SP)←\leftarrow←(SP)+n

I/O中断

物理地址=类型码*4
中断类型码/中断向量号 0~255
每个中断向量4byte,高字CS,低字IP
int:将flag入栈,清除TF、IF。CS入栈,IP入栈,最后跳转
into:检测OF。若溢出,中断类型码为4
iret:IP出栈、CS出栈,恢复flags
控制:hlt(停止) nop(空操作) wait(等到test=0)
I/O调用:参数装入指定reg,功能号装入AH
子功能装入AL,调用,返回。
int 21H:

AH功能参数返回
1输入字符,回显AL=字符
6读字符,回显DL=0FFHAL=字符,ZF=0。若无字符,AL=0,ZF=1
7输入字符,不回显AL=字符
A输入字符到缓冲区DS:DX=缓冲区首地址
2显示字符一个(检验ctrl-break)DL=字符ASCII
9显示字符串DS:DS=串首地址,以$结束

0DH:回车(光标回到本行第一个字符)
0AH:换行
输出文字

lea bx,string
mov cx,7;7为长度
one:mov dl,cs:[bx]mov ah,2int 21Hinc bxloop one
string db "hello"
end start

输出串

lea dx,string
mov ah,9
int 21h
string db 0DH,0AH,"hello",0DH,0AH,'$'

输入5个数

mov cx,5
mov sum,0
one:mov ah,1int 21hand al,0fhadd sum,alloop one

从键盘输入至多5个数

lea dx,buffer
mov ah,0ah
int 21H
mov sum,0
mov cl,buffer+1
mov ch,0
lea bx,buffer+2
one:mov al,[bx]and al,0fhadd sum,alinc bxloop one

程序逻辑语句

双分支结构一定要跳过另一个分支体。
大小写字母ASCII码差值20H,仅D5D_5D5​位不同。
用地址表实现多分支转移。数据段:addtbl dw f1,f2,f3程序段:jmp addtbl[bx]
循环:
do-while型初始化、工作、修改、控制。
while型循环:初始化、控制、跳出、工作、修改、跳回控制。

无符号字数组以-1为结束,求平均值

lea bx,array
one:cmp word ptr[bx],-1je done;//数组结束add ax,[bx]adc dx,0;保留进位inc cx;//数组元素个数add bx,2jmp one
done:jcxz nulldiv cxmov avg,axjmp exit
null:mov avg,-1

用N2=1+3+...+(2N−1)N^2=1+3+...+(2N-1)N2=1+3+...+(2N−1)求平方根

square proc nearpush cxpush bxmov bx,ax;要求的数mov al,0mov cx,1
next:sub bx,cxjb doneinc aladd cx,2jmp next
done:pop bxpop cxret
square endp

可以自带数据区,在ret后、endp前,用cs段超越
表达式计算:
Z=100(X/Y+W)+RZ=100(X/Y+W)+RZ=100(X/Y+W)+R

mov ax,x
cwd
idiv y
add ax,w
mov bx,100
imul bx
mov cx,ax
mov bx,dx
mov ax,r
cwd
add ax,cx
adc dx,bx
mov z,ax
mov z+2,dx

中断服务程序示例

point dw 0
temp db 500 dup(?)
intproc proc farpush dspush axstimov ax,seg tempmov ds,axmov bx,pointin al,60Hmov temp[bx],alint pontclimov al,20Hout 20H,alpop axpop dsiret
intproc endp

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...