1、32位微机原理考试重点1,原码:0表示 “+”,1表示“”,数值位与真值数值位相同。反码:正数的反码与原码表示相同。负数反码符号位为1,数值位为原码数值各位取反。补码:正数的补码表示与原码相同。负数补码的符号位为1,数值位等于反码加1。 X补= X反+1 负数直接求补: 从最低位起,到出现第一个1以前原码中的 数字不变,以后逐位取反,但符号位不变。2,各种编码方法的表数范围: n+1位二进制编码x表示的整数范围: 原码、反码:-2nx2n 补码:-2nx2n8位原码、反码的表数范围是-127+127,补码的表数范围是-128+127;16位原码、反码的表数范围是-32767+32767,补码的
2、表数范围是-32768+327673,原码、反码、补码表示小结:正数的原码、反码、补码表示均相同,符号位为0,数值位同数的真值。零的原码和反码均有2个编码,补码只有1个编码。负数的原码、反码、补码表示均不同,符号位为1,数值位:原码为数的绝对值 反码为每一位均取反码 补码为反码再在最低位+1由X补求-X补:逐位取反(包括符号位),再在最低位+1 4,进位标志CF(Carry Flag):运算结果的最高位产生进位或借位时,或循环指令也会影响该位。奇偶标志PF(Parity Flag):运算结果的低8位中所含1的个数为偶数个,则该位置1。辅助进位标志AF(Auxiliary Carry Flag)
3、:加减法运算时,如果第3位与第4位之间有进位或借位产生,则该位置1。一般用于BCD运算中是否进行十进制调整的判断依据。零标志ZF(Zero Flag):运算结果为零,则该位置1。符号标志SF(Sign Flag):与运算结果符号位(即最高位)相同。溢出标志OF(Overflow Flag):当运算结果超出结果寄存器的表达范围时,该位置1。 跟踪标志TF(Trap Flag):控制CPU按调试的单步方式执行指令。中断允许标志IF(Interrupt Enable Flag):控制CPU对外部可屏蔽中断(INTR)的响应。当IF=1时,允许CPU响应外部可屏蔽中断;当IF=0时,禁止响应INTR,
4、但不禁止CPU对非屏蔽中断(NMI)的响应。方向标志DF(Direction Flag):用于控制串操作指令中的地址变化方向 。 5,立即寻址方式:8086 CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即寻址方式。 例如: MOV AL,80H;将十六进制数80H送入AL MOV AX,1090H;将1090H送AX,AH中为10H,AL中为90H寄存器寻址方式:如果操作数在CPU的内部寄存器中,那么寄存器名可在指令中指出。这种寻址方式就叫寄存器寻址方式。 例如: INCCX;将CX的内容加1 MOVAX, BX ;将BX内容送AX,BX内容不变 ROLA
5、H,1;将AH中的内容不带进位循环左移一位采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,执行速度快。直接寻址方式:使用直接寻址方式,数据在存储器中,存储单元有效地址EA由指令直接指出,所以直接寻址是对存储器进行访问时最简单的方式例如:MOV AX, 2000H 寄存器间接寻址方式:采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出。这些寄存器可以是BX,BP,SI和DI,即有效地址等于其中某一个寄存器的值寄存器相对寻址方式(直接变址寻址): 操作数有效地址EA为基址或变址寄存器内容与指令中指定位移量之和,操作数在存储器中。可用寄存器及
6、其对应的默认段情况与寄存器间接寻址方式相同。基址变址寻址方式: 用这种寻址方式时,操作数的有效地址等于基址寄存器的内容加上一个变址寄存器的内容,16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP以外的32位通用寄存器。用MOV指令实现两内存字节单元内容的交换1、MOV BL, 2035H; MOV CL, 2045H; MOV 2045H, BL; MOV 2035H, CL;2、MOV AL, 2035H; XCHG AL, 2045H; MOV 2035H, AL; 测试某状态寄存器(端口号27H)的第
7、2位是否为1 IN AL, 27H TEST AL, 00000100B JNZ ERROR ;若第2位为1,转ERROR处理设数据段: ADDR1 DF 1234567890ABH 则 LES EBX,ADDR1 指令执行后 (ES)=1234H, (EBX)=567890ABH【例题】实现两个无符号双字加法运算。设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。源操作数存放在BX、CX中,其中BX存放高位字。如指令执行前(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H 指令序列为 ADD AX,CX ADC DX,BX 则第一条指令执行后,
8、(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0 第二条指令执行后,(DX)=0008H,SF=0,ZF=0,CF=0,OF=0 【例题】比较AL的内容数值大小。 CMP AL,100 ;(AL)100 JB BELOW ;(AL)=100,(AL)100AL INC AH ;(AH)+1AH BELOW: 【例题】设x、y、z均为双字长数,它们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中,编写指令序列实现 w x+y+24 z,并用w和w+2单元存放运算结果。MOV AX,XMOV DX,X+2ADD AX,YADC
9、DX,Y+2ADD AX,24ADC DX,0SUB AX,ZSBB DX,Z+2MOV W,AXMOV W+2,DX【例题】无符号数0A3H与11H相乘。 MOV AL,0A3H ;(AL)=0A3H MOV BL, 11H ;(BL)=11H MUL BL ;(AX)=0AD3H【例题】若(AL)= 0B4H,(BL)=11H,求执行指令IMUL BL 和 MUL BL 后的乘积值。 (AL)= 0B4H为无符号数的180D,带符号数的-76D (BL)=11H为无符号数的17D,带符号数的17D 则执行IMUL BL 的结果为(AX)=0FAF4H =-1292D,CF=OF=1 执行M
10、UL BL 的结果为(AX)= 0BF4H = 3060D,CF=OF=1【例题】写出实现无符号数0400H/0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H MOV BL,0B4H ;(BL)=0B4H DIV BL ;商(AL)=05H,余数(AH)=7CH 【例题】写出实现有符号数0400H /0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H MOV BL,0B4H ;(BL)=0B4H IDIV BL ;(AL)=0F3H,(AH)=24H算术运算综合举例【例3-36】计算:(C120 + A*B) / C,保存商和余数到X和Y中,其中A
11、、B、C、X和Y都是有符号的字变量 。编制程序如下:MOV AX, C SUB AX, 120 CWD MOV CX, DX MOV BX, AX ;(CX, BX)(DX, AX)MOV AX, A IMUL B ; (DX, AX)A*B ADD AX, BX ;计算32位二进制之和ADC DX, CX IDIV C ;AX是商,DX是余数 MOV X, AX ;保存商到指定单元 MOV Y, DX 课堂练习计算:(V-(X*Y+Z-540)/X,其中X,Y,Z,V均为16位带符号数,已分别装入X,Y,Z,V单元中,上式计算结果的商存入AX,余数存入DX寄存器。编制程序如下:mov ax,
12、 ximul ymov cx, axmov bx, dxmov ax, zcwdadd cx, axadc bx, dxsub cx, 540sbb bx, 0mov ax, vcwdsub ax, cxsbb dx, bxidiv x【例题】压缩BCD码的加法运算。 MOV AL,68H ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 ADD AL,BL ;二进制加法:(AL)=68H+28H=90H DAA ;十进制调整:(AL)=96H ;实现压缩BCD码加法:68+28=96【例题】压缩BCD码的减法运算。 MOV AL,68H
13、 ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 SUB AL,BL ;二进制减法:(AL)=68H28H=40H DAS ;十进制调整:(AL)=40H ;实现压缩BCD码减法:6828=40【例题】 AND AL,77H ;将AL中第3位和第7位清零。 AND AX,BX ;两个寄存器逻辑与 AND AL,1111 0000B ;屏蔽AL寄存器低4位 AND MEM-BYTE,AL;存储单元和寄存器逻辑与例题】 OR AL,88H ;将AL寄存器中第3位和第7位置1 OR BX,0C000H ;将BX中第15位和第14位置1【例题】
14、逻辑非运算。 MOV AX,878AH ;(AX)=878AH NOT AX ;(AX)=7875H NOTWORD PTR1000H;将1000H和1001H两单 ;元中的内容求反码,再送回这两单元中【例题】测试AX中的第12位是否为0,不为0则转L。 TEST AX,1000H JNE L / JNZ L 例3-54:(BX)=84F1H,把 (BX) 中的 16 位数每 4 位压入堆栈MOV CH, 2 ; 循环次数 MOV CL, 4 ; 移位次数NEXT: ROL BX, CL MOV AH, BL AND AH, 0FH ROL BX, CL MOV AL, BL AND AL,
15、0FH PUSH AX DEC CH JNZ NEXT例题:设BLOCK数据块中存储有正数和负数,试编写程序将正负数分开,分别存放在Dplus和Dminus开始的存储区域mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds mov es,ax ;数据都在一个段中,所以设置es=ds mov cx,count ;cx字节数 cldgo_on: lodsb ;从block取出一个数据 test al,80h ;检测符号位,判断是正是负 jnz minus ;符号位为1,是负数,转向minus stosb ;符号
16、位为0,是正数,存入dplus jmp again ;程序转移到again处继续执行minus: xchg bx,di stosb ;把负数存入dminus xchg bx,diagain: loop go_on ;字节数减1 例:检验一段被传送过的数据是否与源串完全相 同,程序如下:CLDMOV CX,100初始化MOV SI,2400HMOV DI,1200H;REPECMPSB ;串比较,直到ZF0或CX0JZ EQQDEC SIMOV BX,SI;第一个不相同字节偏移地址BXMOV AL,SI;第一个不相同字节内容ALJMP STOPEQQ: MOV BX,0 ;两串完全相同,BX0S
17、TOP:HLTv 例题:在某字符串中查找是否存在“”字符。若存在,则将“”字符所在地址送入BX寄存器中,否则将BX寄存器清“0”。程序如下: CLD ;清除方向标志DF MOV DI,0100H ;送目标串首元素偏移地址 MOV CX,100 ;字串长度 MOV AL,;关键字AL REPNESCASB ;找关键字 JNZ ZER ;判断是否找到 DEC DI MOV BX,DI ;关键字所在地址BX JMP ST0 ZER: MOV BX,0 ;未找到,0BX ST0: HLT例题:比较两个长度为count的字符串是否完全相同,若相同置al=0,不相同置al=0ffh mov si,offs
18、et string1 mov di,offset string2 mov cx,count cld mov al,0ffh ;标记初始为不同mov al,0 ;字符串相等,设置00houtput:mov result,al ;输出结果标记 例3.61 若AL最高位为0,设置(AH)0;若AL最高位为1,则设置(AH)FFH。即编程实现符号扩展指令CBW功能 v 方法一:用JZ指令实现。 test al, 80h ;测试最高位 jz set0 ;最高位为0则转到set0 mov ah, 0ffh ;最高位为1,则将AH置0FFH jmp next ;无条件转向next set0: mov ah,
19、 0 next: v 方法二:用JNZ指令实现。 test al, 80h ;测试最高位 jnz set1 ;最高位为1则转到set1 mov ah, 0h ;最高位为0,则将AH置0 jmp next ;无条件转向next set1: mov ah, 0ffh next: 例3.62 计算|XY|,X和Y是存放于X单元和Y单元的16位操作数,结果存入result mov ax, X sub ax, Y ;XY送AX,下面求绝对值 jns next ;绝对值为正,不需处理,转向next保存结果 neg ax ;绝对值为负,进行求补得到绝对值 next: mov result, ax ;保存结果
20、 例3.63 编写程序段判断DX中1的个数 xor al, alagain: test dx, offffh ;等价于cmp bx,0 je next shl dx, 1 jnc again inc al jmp againnext: ;AL保存1的个数例3.64 比较AX和BX中两个无符号数的大小,将较小的存放到AX中 cmp ax, bx ;比较ax和bx JB next ;若axbx,则转移到next xchg ax, bx ;若axbx,则两者交换next: 例3.65 比较AX和BX中两个有符号数的大小,将较小的存放到AX中 cmp ax, bx ;比较ax和bx JL next ;
21、若axbx,则转移到next xchg ax, bx ;若axbx,则两者交换next: 例3.66 a、b是双精度数,分别存于DX,AX 及BX,CX 中,a b时转 L1,否则转L2 cmp dx, bx ;比较dx和bx JG l1 ;若dxbx,则转移到l1 JL l2 ;若dxbx,则转移到l2 cmp ax, cx ;若dx=bx,则比较ax和cx JA l1 ;若axcx,则转移到l1l2: l1: 例3-67:求首地址为 ARRAY 的 n个字之和,结果存入 sum单元mov cx, n ;将计数值n送CX xor ax, ax ;累加器AX清零 xor dx, dx ;DX清
22、零 xor si, si ;SI清零again: add ax, arraysi ;将下一个数据累加到AX adc dx, 0 ;将产生的进位累加到DX add si, 2 ;SI加2,指向下一个数据 loop again ;若CX不为0,继续循环 mov sum, ax ;结果低16位送sum单元例4.21】 (1)编写程序把 BX 中的二进制数以十六进制数的形式显示在屏幕上 。CODE SEGMENT ASSUME CS:CODESTART: MOV CH, 4 ;设置循环初值为4ROTAT: MOV CL, 4 ROL BX, CL ;BX循环左移4位 MOV AL, BL AND AL
23、, 0FH ;把最右面要显示的4位取到AL中 ADD AL, 30H ;将其加30H转换为ASCII码 CMP AL, 3AH ;判断是否大于9 JL PRINT ;“0”“9”,转向PRINTIT直接显示 ADD AL, 7H ;“A” “F”, ASCII 值再加7PRINT: MOV DL, AL ;2号功能调用,显示该字符 MOV AH, 2 INT 21H DEC CH JNZ ROTAT ;若循环次数未到,则继续循环 MOV AH, 4CH INT 21H ;程序结束,返回DOSCODE ENDS END START【例4.24】 数据段中从BUF单元开始的数据区内存放着一组有符号
24、字数据,其中第一个单元存放数组元素个数,请编一程序求出该数组中的最大值、最小值及总和,并分别存入MAX、MIN、SUM单元中 DATA SEGMENT BUF DW 12 DW 5,-4,0,3,100,-51,69,-21,-5,255,33,150 MAX DW ? MIN DW ? SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV SI, 2 ;初始化SI、AX、BX、DX MOV AX, BUFSI MOV BX, BUFSI MOV DX, BUFSI MOV
25、 CX, BUF ;初始化循环计数器CX DEC CXL: ADD SI, 2 CMP BX, BUFSI ;比较 JL LESS CMP DX, BUFSI JG GREATER JMP SLESS: MOV BX, BUFSI ;大数送入BX JMP SGREATER: MOV DX, BUFSI ;小数送入DXS: ADD AX, BUFSI ;求累加和,送入AX LOOP L MOV MAX,BX ;最大值、最小值及总和分别存 MOV MIN,DX ;入MAX、MIN、SUM单元 MOV SUM,AX MOV AH,4CH INT 21HCODE ENDS END START例4.25
26、】字符串STRING以回车符作为结束标志,编程统计该字符串的长度 DATA SEGMENT LEN DB ? STRING DB computer science and technology,0DHDATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATASTART: MOV AX, DATA MOV DS, AX MOV ES, AX LEA DI, STRING ;串的首地址送入DI MOV DL, 0 ;置串长度初值为0 MOV AL, 0DH ;串结束标志送入ALAGAIN: SCASB ;搜索串 JE DONE ;找到结束标志,转向
27、DONE结束 INC DL ;否则,串长度加1 JMP AGAINDONE: MOV LEN,DL ;串长度送入LEN MOV AH, 4CH INT 21HCODE ENDS END START 【例4.20】从键盘接收两个有符号十进制数,并求它们的和,再将结果以有符号十进制数的形式在屏幕上显示输出。DATA SEGMENT MES1 DB input the first number:$ MES2 DB input the second number:$ MES3 DB the sum is:$ X DW ? Y DW ? SUM DW ?DATA ENDSCODE SEGMENT ASS
28、UME CS:CODE, DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES1MOV AH,9INT 21H ;显示输入提示信息CALL READ ;调用子程序READ,输入第一个数MOV X,AX ;将输入的第一个数送入变量XCALL CRLF ;调用子程序CRLFMOV DX,OFFSET MES2MOV AH,9INT 21H ;显示输入提示信息CALL READ ;调用子程序READ,输入第二个数MOV Y,AX ;将输入的第二个数送入变量YADD AX,X ;两数相加MOV SUM,AX ;和送到SUM,入口参数MOV DX,O
29、FFSET MES3MOV AH,9INT 21H ;显示输出提示信息CALL WRITE ;调用子程序WRITE,显示结果MOV AH,4CHINT 21HREAD PROC NEAR ;输入有符号十进制数的子程序READ PUSH BX PUSH CX PUSH DX XOR BX,BX ;用BX保存结果 XOR CX,CX ;正负标志,0为正,1为负 MOV AH,1 ;输入一个字符 INT 21H CMP AL, + ;比较是否为“” JZ READ1 ;是“”,转向READ1继续输入 CMP AL, ;否则,比较是否为“” JNZ READ2 ;不是“”和“”,转向READ2 MOV
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1