32位微机原理考试重点.docx
《32位微机原理考试重点.docx》由会员分享,可在线阅读,更多相关《32位微机原理考试重点.docx(35页珍藏版)》请在冰豆网上搜索。
32位微机原理考试重点
1,原码:
0表示“+”,1表示“-”,数值位与真值数值位相同。
反码:
正数的反码与原码表示相同。
负数反码符号位为1,数值位为原码数值各位取反。
补码:
正数的补码表示与原码相同。
负数补码的符号位为1,数值位等于反码加1。
[X]补=[X]反+1负数直接求补:
从最低位起,到出现第一个1以前原码中的数字不变,以后逐位取反,但符号位不变。
2,各种编码方法的表数范围:
n+1位二进制编码x表示的整数范围:
原码、反码:
-2n<x<2n
补码:
-2n≤x<2n
8位原码、反码的表数范围是-127~+127,补码的表数范围是-128~+127;16位原码、反码的表数范围是-32767~+32767,补码的表数范围是-32768~+32767
3,原码、反码、补码表示小结:
正数的原码、反码、补码表示均相同,
符号位为0,数值位同数的真值。
零的原码和反码均有2个编码,补码只有1个编码。
负数的原码、反码、补码表示均不同,
符号位为1,数值位:
原码为数的绝对值
反码为每一位均取反码
补码为反码再在最低位+1
由[X]补求[-X]补:
逐位取反(包括符号位),再在最低位+1
4,进位标志CF(CarryFlag):
运算结果的最高位产生进位或借位时,或循环指令也会影响该位。
奇偶标志PF(ParityFlag):
运算结果的低8位中所含1的个数为偶数个,则该位置1。
辅助进位标志AF(AuxiliaryCarryFlag):
加减法运算时,如果第3位与第4位之间有进位或借位产生,则该位置1。
一般用于BCD运算中是否进行十进制调整的判断依据。
零标志ZF(ZeroFlag):
运算结果为零,则该位置1。
符号标志SF(SignFlag):
与运算结果符号位(即最高位)相同。
溢出标志OF(OverflowFlag):
当运算结果超出结果寄存器的表达范围时,该位置1。
跟踪标志TF(TrapFlag):
控制CPU按调试的单步方式执行指令。
中断允许标志IF(InterruptEnableFlag):
控制CPU对外部可屏蔽中断(INTR)的响应。
当IF=1时,允许CPU响应外部可屏蔽中断;当IF=0时,禁止响应INTR,但不禁止CPU对非屏蔽中断(NMI)的响应。
方向标志DF(DirectionFlag):
用于控制串操作指令中的地址变化方向。
5,立即寻址方式:
8086CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即寻址方式。
⏹例如:
MOVAL,80H;将十六进制数80H送入AL
MOVAX,1090H;将1090H送AX,AH中为10H,AL中为90H
寄存器寻址方式:
如果操作数在CPU的内部寄存器中,那么寄存器名可在指令中指出。
这种寻址方式就叫寄存器寻址方式。
⏹例如:
INC CX ;将CX的内容加1
MOV AX,BX;将BX内容送AX,BX内容不变
ROL AH,1 ;将AH中的内容不带进位循环左移一位
采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,执行速度快。
直接寻址方式:
使用直接寻址方式,数据在存储器中,存储单元有效地址EA由指令直接指出,所以直接寻址是对存储器进行访问时最简单的方式
例如:
MOVAX,[2000H]
寄存器间接寻址方式:
采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出。
这些寄存器可以是BX,BP,SI和DI,即有效地址等于其中某一个寄存器的值
寄存器相对寻址方式(直接变址寻址):
操作数有效地址EA为基址或变址寄存器内容与指令中指定位移量之和,操作数在存储器中。
可用寄存器及其对应的默认段情况与寄存器间接寻址方式相同。
基址变址寻址方式:
用这种寻址方式时,操作数的有效地址等于基址寄存器的内容加上一个变址寄存器的内容,16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP以外的32位通用寄存器。
用MOV指令实现两内存字节单元内容的交换
1、MOVBL,[2035H];
MOVCL,[2045H];
MOV[2045H],BL;
MOV[2035H],CL;
2、MOVAL,[2035H];
XCHGAL,[2045H];
MOV[2035H],AL;
测试某状态寄存器(端口号27H)的第2位是否为1
INAL,27H
TESTAL,00000100B
JNZERROR;若第2位为1,转ERROR处理
设数据段:
ADDR1DF1234567890ABH
则LESEBX,ADDR1
指令执行后(ES)=1234H,(EBX)=567890ABH
【例题】实现两个无符号双字加法运算。
设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。
源操作数存放在BX、CX中,其中BX存放高位字。
如指令执行前(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H
指令序列为ADDAX,CX
ADCDX,BX
则第一条指令执行后,(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0
第二条指令执行后,(DX)=0008H,SF=0,ZF=0,CF=0,OF=0
【例题】比较AL的内容数值大小。
CMPAL,100;(AL)-100
JBBELOW;(AL)<100,转到BELOW处执行
SUBAL,100;(AL)>=100,(AL)-100→AL
INCAH;(AH)+1→AH
BELOW:
…
【例题】设x、y、z均为双字长数,它们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中,编写指令序列实现w←x+y+24–z,并用w和w+2单元存放运算结果。
MOVAX,X
MOVDX,X+2
ADDAX,Y
ADCDX,Y+2
ADDAX,24
ADCDX,0
SUBAX,Z
SBBDX,Z+2
MOVW,AX
MOVW+2,DX
【例题】无符号数0A3H与11H相乘。
MOVAL,0A3H;(AL)=0A3H
MOVBL,11H;(BL)=11H
MULBL;(AX)=0AD3H
【例题】若(AL)=0B4H,(BL)=11H,求执行指令IMULBL和MULBL后的乘积值。
(AL)=0B4H为无符号数的180D,带符号数的-76D
(BL)=11H为无符号数的17D,带符号数的17D
则执行IMULBL的结果为(AX)=0FAF4H=-1292D,CF=OF=1
执行MULBL的结果为(AX)=0BF4H=3060D,CF=OF=1
【例题】写出实现无符号数0400H/0B4H运算的程序段。
MOVAX,0400H;(AX)=0400H
MOVBL,0B4H;(BL)=0B4H
DIVBL;商(AL)=05H,余数(AH)=7CH
【例题】写出实现有符号数0400H/0B4H运算的程序段。
MOVAX,0400H;(AX)=0400H
MOVBL,0B4H;(BL)=0B4H
IDIVBL;(AL)=0F3H,(AH)=24H
算术运算综合举例【例3-36】
计算:
(C-120+A*B)/C,保存商和余数到X和Y中,其中A、B、C、X和Y都是有符号的字变量。
编制程序如下:
MOVAX,C
SUBAX,120
CWD
MOVCX,DX
MOVBX,AX;(CX,BX)←(DX,AX)
MOVAX,A
IMULB;(DX,AX)←A*B
ADDAX,BX;计算32位二进制之和
ADCDX,CX
IDIVC;AX是商,DX是余数
MOVX,AX;保存商到指定单元
MOVY,DX
…
课堂练习
计算:
(V-(X*Y+Z-540))/X,其中X,Y,Z,V均为16位带符号数,已分别装入X,Y,Z,V单元中,上式计算结果的商存入AX,余数存入DX寄存器。
编制程序如下:
movax,x
imuly
movcx,ax
movbx,dx
movax,z
cwd
addcx,ax
adcbx,dx
subcx,540
sbbbx,0
movax,v
cwd
subax,cx
sbbdx,bx
idivx
【例题】压缩BCD码的加法运算。
MOVAL,68H;(AL)=68H,表示压缩BCD码68
MOVBL,28H;(BL)=28H,表示压缩BCD码28
ADDAL,BL;二进制加法:
(AL)=68H+28H=90H
DAA;十进制调整:
(AL)=96H
;实现压缩BCD码加法:
68+28=96
【例题】压缩BCD码的减法运算。
MOVAL,68H;(AL)=68H,表示压缩BCD码68
MOVBL,28H;(BL)=28H,表示压缩BCD码28
SUBAL,BL;二进制减法:
(AL)=68H-28H=40H
DAS;十进制调整:
(AL)=40H
;实现压缩BCD码减法:
68-28=40
【例题】ANDAL,77H;将AL中第3位和第7位清零。
ANDAX,BX;两个寄存器逻辑与
ANDAL,11110000B;屏蔽AL寄存器低4位
ANDMEM-BYTE,AL;存储单元和寄存器逻辑与
例题】
ORAL,88H;将AL寄存器中第3位和第7位置1
ORBX,0C000H;将BX中第15位和第14位置1
【例题】逻辑非运算。
MOVAX,878AH;(AX)=878AH
NOTAX;(AX)=7875H
NOT WORDPTR[1000H];将1000H和1001H两单
;元中的内容求反码,再送回这两单元中
【例题】测试AX中的第12位是否为0,不为0则转L。
TESTAX,1000H
JNEL/JNZL
例3-54:
(BX)=84F1H,把(BX)中的16位数每4位压入堆栈
MOVCH,2;循环次数
MOVCL,4;移位次数
NEXT:
ROLBX,CL
MOVAH,BL
ANDAH,0FH
ROLBX,CL
MOVAL,BL
ANDAL,0FH
PUSHAX
DECCH
JNZNEXT
例题:
设BLOCK数据块中存储有正数和负数,试编写程序将正负数分开,分别存放在Dplus和Dminus开始的存储区域
movsi,offsetblock
movdi,offsetdplus
movbx,offsetdminus
movax,ds
moves,ax;数据都在一个段中,所以设置es=ds
movcx,count;cx←字节数
cld
go_on:
lodsb;从block取出一个数据
testal,80h;检测符号位,判断是正是负
jnzminus;符号位为1,是负数,转向minus
stosb;符号位为0,是正数,存入dplus
jmpagain;程序转移到again处继续执行
minus:
xchgbx,di
stosb;把负数存入dminus
xchgbx,di
again:
loopgo_on;字节数减1
例:
检验一段被传送过的数据是否与源串完全相
同,程序如下:
CLD
MOVCX,100 初始化
MOVSI,2400H
MOVDI,1200H;
REPE CMPSB ;串比较,直到ZF=0或CX=0
JZ EQQ
DEC SI
MOV BX,SI ;第一个不相同字节偏移地址→BX
MOV AL,[SI] ;第一个不相同字节内容→AL
JMP STOP
EQQ:
MOV BX,0 ;两串完全相同,BX=0
STOP:
HLT
v例题:
在某字符串中查找是否存在“$”字符。
若存在,则将“$”字符所在地址送入BX寄存器中,否则将BX寄存器清“0”。
程序如下:
CLD ;清除方向标志DF
MOV DI,0100H ;送目标串首元素偏移地址
MOVCX,100;字串长度
MOV AL,′$′ ;关键字→AL
REPNE SCASB ;找关键字
JNZ ZER;判断是否找到
DEC DI
MOV BX,DI ;关键字所在地址→BX
JMP ST0
ZER:
MOV BX,0 ;未找到,0→BX
ST0:
HLT
例题:
比较两个长度为count的字符串是否完全相同,若相同置al=0,不相同置al=0ffh
movsi,offsetstring1
movdi,offsetstring2
movcx,count
cld
moval,0ffh;标记初始为不同
moval,0;字符串相等,设置00h
output:
movresult,al;输出结果标记
⏹例3.61若AL最高位为0,设置(AH)=0;若AL最高位为1,则设置(AH)=FFH。
即编程实现符号扩展指令CBW功能
v方法一:
用JZ指令实现。
testal,80h;测试最高位
jzset0;最高位为0则转到set0
movah,0ffh;最高位为1,则将AH置0FFH
jmpnext;无条件转向next
set0:
movah,0
next:
…
v方法二:
用JNZ指令实现。
testal,80h;测试最高位
jnzset1;最高位为1则转到set1
movah,0h;最高位为0,则将AH置0
jmpnext;无条件转向next
set1:
movah,0ffh
next:
…
⏹例3.62计算|X-Y|,X和Y是存放于X单元和Y单元的16位操作数,结果存入result
movax,X
subax,Y;X-Y送AX,下面求绝对值
jnsnext;绝对值为正,不需处理,转向next保存结果
negax;绝对值为负,进行求补得到绝对值
next:
movresult,ax;保存结果
⏹例3.63编写程序段判断DX中1的个数
xoral,al
again:
testdx,offffh;等价于cmpbx,0
jenext
shldx,1
jncagain
incal
jmpagain
next:
…;AL保存1的个数
例3.64比较AX和BX中两个无符号数的大小,将较小的存放到AX中
cmpax,bx;比较ax和bx
JBnext;若ax<bx,则转移到next
xchgax,bx;若ax≥bx,则两者交换
next:
…
例3.65比较AX和BX中两个有符号数的大小,将较小的存放到AX中
cmpax,bx;比较ax和bx
JLnext;若ax<bx,则转移到next
xchgax,bx;若ax≥bx,则两者交换
next:
…
例3.66a、b是双精度数,分别存于DX,AX及BX,CX中,a>b时转L1,否则转L2
cmpdx,bx;比较dx和bx
JGl1;若dx>bx,则转移到l1
JLl2;若dx<bx,则转移到l2
cmpax,cx;若dx=bx,则比较ax和cx
JAl1;若ax>cx,则转移到l1
l2:
……
l1:
……
例3-67:
求首地址为ARRAY的n个字之和,结果存入sum单元
movcx,n;将计数值n送CX
xorax,ax;累加器AX清零
xordx,dx;DX清零
xorsi,si;SI清零
again:
addax,array[si];将下一个数据累加到AX
adcdx,0;将产生的进位累加到DX
addsi,2;SI加2,指向下一个数据
loopagain;若CX不为0,继续循环
movsum,ax;结果低16位送sum单元
例4.21】
☐
(1)编写程序把BX中的二进制数以十六进制数的形式显示在屏幕上。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVCH,4;设置循环初值为4
ROTAT:
MOVCL,4
ROLBX,CL;BX循环左移4位
MOVAL,BL
ANDAL,0FH;把最右面要显示的4位取到AL中
ADDAL,30H;将其加30H转换为ASCII码
CMPAL,3AH;判断是否大于9
JLPRINT;“0”~“9”,转向PRINTIT直接显示
ADDAL,7H;“A”~“F”,ASCII值再加7
PRINT:
MOVDL,AL;2号功能调用,显示该字符
MOVAH,2
INT21H
DECCH
JNZROTAT;若循环次数未到,则继续循环
MOVAH,4CH
INT21H;程序结束,返回DOS
CODEENDS
ENDSTART
【例4.24】数据段中从BUF单元开始的数据区内存放着一组有符号字数据,其中第一个单元存放数组元素个数,请编一程序求出该数组中的最大值、最小值及总和,并分别存入MAX、MIN、SUM单元中
DATASEGMENT
BUFDW12
DW5,-4,0,3,100,-51,69,-21,-5,255,33,150
MAXDW?
MINDW?
SUMDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,2;初始化SI、AX、BX、DX
MOVAX,BUF[SI]
MOVBX,BUF[SI]
MOVDX,BUF[SI]
MOVCX,BUF;初始化循环计数器CX
DECCX
L:
ADDSI,2
CMPBX,BUF[SI];比较
JLLESS
CMPDX,BUF[SI]
JGGREATER
JMPS
LESS:
MOVBX,BUF[SI];大数送入BX
JMPS
GREATER:
MOVDX,BUF[SI];小数送入DX
S:
ADDAX,BUF[SI];求累加和,送入AX
LOOPL
MOVMAX,BX;最大值、最小值及总和分别存
MOVMIN,DX;入MAX、MIN、SUM单元
MOVSUM,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例4.25】字符串STRING以回车符作为结束标志,编程统计该字符串的长度
DATASEGMENT
LENDB?
STRINGDB‘computerscienceandtechnology’,0DH
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEADI,STRING;串的首地址送入DI
MOVDL,0;置串长度初值为0
MOVAL,0DH;串结束标志送入AL
AGAIN:
SCASB;搜索串
JEDONE;找到结束标志,转向DONE结束
INCDL;否则,串长度加1
JMPAGAIN
DONE:
MOVLEN,DL;串长度送入LEN
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【例4.20】从键盘接收两个有符号十进制数,并求它们的和,再将结果以有符号十进制数的形式在屏幕上显示输出。
DATASEGMENT
MES1DB‘inputthefirstnumber:
$’
MES2DB‘inputthesecondnumber:
$’
MES3DB‘thesumis:
$’
XDW?
YDW?
SUMDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMES1
MOVAH,9
INT21H;显示输入提示信息
CALLREAD;调用子程序READ,输入第一个数
MOVX,AX;将输入的第一个数送入变量X
CALLCRLF;调用子程序CRLF
MOVDX,OFFSETMES2
MOVAH,9
INT21H;显示输入提示信息
CALLREAD;调用子程序READ,输入第二个数
MOVY,AX;将输入的第二个数送入变量Y
ADDAX,X;两数相加
MOVSUM,AX;和送到SUM,入口参数
MOVDX,OFFSETMES3
MOVAH,9
INT21H;显示输出提示信息
CALLWRITE;调用子程序WRITE,显示结果
MOVAH,4CH
INT21H
READPROCNEAR;输入有符号十进制数的子程序READ
PUSHBX
PUSHCX
PUSHDX
XORBX,BX;用BX保存结果
XORCX,CX;正负标志,0为正,-1为负
MOVAH,1;输入一个字符
INT21H
CMPAL,‘+’;比较是否为“+”
JZREAD1;是“+”,转向READ1继续输入
CMPAL,‘-’;否则,比较是否为“-”JNZREAD2;不是“+”和“-”,转向READ2
MOV