首页 微机

微机

举报
开通vip

微机nullnull分析下列子程序FUNC1,并回答相应的问题。FUNC1 PROC NEAR XOR CX,CX MOV DX,01 MOV CL,X JCXZ A20 INC DX INC DX ...

微机
nullnull分析下列子程序FUNC1,并回答相应的问题。FUNC1 PROC NEAR XOR CX,CX MOV DX,01 MOV CL,X JCXZ A20 INC DX INC DX DEC CX JCXZ A20 A10: MOV AX,02 SHL AX,CL ADD DX,AX LOOP A10 A20: MOV Y,DX RET FUNC1 ENDP若该子程序的入口参数为X,其输出参数为Y,则 (1)该函数与主程序之间采用何种方式的参数传递? (2)若X=0,则Y= 若X=3,则Y= 若X=5,则Y= (3)该子程序的功能是Y=f(X)=null下面使将内存一字节数据高4位和低4位互换并放回原位置的程序,找出其中的错误并加以改正。DATA SEGMENT DD1 DB 23H DATA END CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS, AX LEA SI,OFFSET DD1 MOV AL,[SI] MOV CL,4 RCR AL,CL MOV [SI],AL MOV AH,4CH INT 21H CODE ENDS END STARTnull下面的程序是将内存 单元 初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计 一字节数据乘以10后再放回原处的程序,找出其中的错误并加以改正。DATA SEGMENT DA DW 34 DATA END CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS, AX MOV SI,OFFSET DA MOV AL,[SI] MUL 10 MOV [SI],AX MOV AH,4CH INT 21H CODE ENDS END STARTnull1.已知变量var1的逻辑地址为1500H:0000H,在程序的数据段有如下定义,试画出变量的内存存储示意图。 var1 DW 2 DUP(2, 2 DUP(1,2)) var2 DD var1+0FH2.已知变量var3的逻辑地址为1500H:0100H在程序的数据段有如下定义,试画出变量的内存存储示意图。 var3 DB ‘EF’,’XY’ var4 DW ‘EF’,’XY’null1500H:0000H1500H:000AHvar1var2null1500H:0100Hvar3var41500H:0104Hnull利用补码运算时,不能在十进制数和补码之间直接写等号。[87+(-73)]补= =[87]补+[-73]补 =01010111B+10110111Bnull题目明确了按8位二进制补码计算,却写成两位补码。 [-1]补=11Bnull原码、补码和真值之间不能直接写等号-14=11110010Bnull二进制数和十六进制数不能漏写尾部字母;十六进制数首字符为A-F时应先写0nullBCD码运算时,若需要修正,需要在式中写出,否则不能写等号。(99)BCD+ (88) BCD =10011001B+10001000B =000100100001B(高位和低位均需加六修正)+01100110B=000110000111Bnull为什么地址总线是单向的,数据总线是双向的? CPU通过地址总线来寻找内存单元或外设,是由CPU发出的地址信息,因而地址总线是单向的。 CPU同存储器和外设之间的信息交换是通过数据总线完成的,CPU既可以向存储器和外设发送数据,亦可以接收存储器和外设反馈的数据,因而数据总线必须是双向的。null用MOV指令实现DS和ES内容的互换。 用MOV指令实现两个字型内存单元var1和var2的内容互换。nullMOV AX, DS MOV BX, ES MOV ES, AX MOV DS, BXMOV AX, var1 MOV BX, var2 MOV var2, AX MOV var1, BXMOV AX, DS MOV DS, ES MOV ES, AXMOV AX, var1 MOV var2, var2 MOV var2, AXnull§1.1 二进制数的基础知识对于n位整数m位小数的任意十进制数N,有:( =0,1,…9)null§1.1 二进制数的基础知识对于n位整数m位小数的任意二进制数 ,有:( =0或1)null§1.1 二进制数的基础知识对于n位整数m位小数的任意十六进制数有:( =0,1,…9,A,B,C,D,E,F)null§1.1 二进制数的基础知识二、 各种进制间的相互转换(1)整数部分:N 除以P取余数 ∴ 301=12DHnull§1.1 二进制数的基础知识例2. 十进制数301 二进制数 转换过程如下:∴ 301=100101101Bnull§1.1 二进制数的基础知识(2)纯小数部分:N乘以P取整数 例1. 十进制小数0.6875 二进制小数 转换过程如下: ∴ 0.6875=0.1011B∴ 0.6875=0.B Hnull§1.2 有符号二进制数的表示方法及溢出问题3. 补码表示法(1)补码的概念x 当 当null§1.2 有符号二进制数的表示方法及溢出问题(2)一个数的补码的求法= = ,x<0即负数x的补码等于模 加上其真值(或减去其真 值的绝对值)。null§1.2 有符号二进制数的表示方法及溢出问题 一个负数的补码等于其原码除符号位保持不变外,其余各位按位取反,再在最低位加1。值的注意的是:0的补码只有唯一的形式,符号位和数值位 均为0。无正负0之分。null §1.2 有符号二进制数的表示方法及溢出问题如:x=-87, 即|x|=0101 0111B原|x|=0 1 0 1 0 1 1 1 B 1 0 1 0 1 0 0 0 B+) 1null§1.2 有符号二进制数的表示方法及溢出问题(3)数的补码表示转换为原码表示 一个用补码表示的负数,如将 再求一次补,即将 除符号位外取反加1,就可得到 ,用下式表示:=null§1.2 有符号二进制数的表示方法及溢出问题(4)补码的运算规则两个n位二进制数之和的补码等于这两数 补码之和,即:null§1.2 有符号二进制数的表示方法及溢出问题两个n位二进制数之差的补码等于这两数 补码之差,即:null§1.2 有符号二进制数的表示方法及溢出问题补码减法运算时,也可以利用加法基本 公式,即:因为:X-Y = X+(-Y)补[X+(-Y)]补[X-Y]== +所以:一般称已知 ,求得 的过程叫变补或求负。null§1.2 有符号二进制数的表示方法及溢出问题变补或求负是一种很有用的运算。求法:null§1.2 有符号二进制数的表示方法及溢出问题例: (+72)+(+98)=+170>+127 溢出0 1 0 0 1 0 0 0 B0 1 1 0 0 0 1 0 B1 0 1 0 1 0 1 0 B+有进位 =1无进位 =0溢出,结果出错(正溢出)null§1.2 有符号二进制数的表示方法及溢出问题例: (-83)+(-80)=-163<-128 溢出1 0 1 0 1 1 0 1 B1 0 1 1 0 0 0 0 B0 1 0 1 1 1 0 1 B+无进位 =0有进位 =1溢出,结果出错(负溢出)[1]null §1.3 二进制编码的十进制数(BCD编码)如:十进制数和BCD码相互转换75.4 BCD码75.4 =BCD码10000101.0101十进制数=85.5 同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数,数值是不相同的。如:=24=18null§1.3 二进制编码的十进制数(BCD编码)如:38+49=870 0 1 1 1 0 0 00 1 0 0 1 0 0 11 0 0 0 0 0 0 138498781显然,结果出错。null §1.3 二进制编码的十进制数(BCD编码)1 0 0 1 0 1 0 0 941 0 1 0 0 0 0 1 高4位满足法则30 0 0 0 0 1 1 1 71 0 0 1 1 0 1 1 低4位满足法则1+null §1.3 二进制编码的十进制数(BCD编码)0 1 0 1 0 0 0 0 500 0 1 0 0 0 0 1 21结果正确0 0 1 0 1 0 0 1 290 0 1 0 0 1 1 1 低码位有借位-`null例1:若CPU执行5439H+476AH加法运算指令:那么,指令执行后有:2.4 微处理器的寄存器组织 SF=1ZF=0PF=1AF=1CF=0OF=1null例2:若CPU执行543AH-FE00H减法运算指令;那么,指令执行后有:0101 0100 0011 1010B1111 1110 0000 0000B0101 0110 0011 1010B-2.4 微处理器的寄存器组织 SF=0ZF=0PF=1AF=0CF=1OF=0null字数据在存储器中存放的格式如图所示字单元的地址一个字单元一个字节单元 高字节 低字节D15 ~ D8D7 ~ D0字数据在存储器中存放格式示意图2.5 微处理器的存储器与I/O组织 字单元的地址是指其低字节单元的地址null 已知某存储单元的逻辑地址,怎样求该单元的 物理地址PA: 物理地址=段地址 10H+段内偏移地址 8086/8088 CPU中的BIU单元用来完成物理地址的计算,其计算方法如图所示。2.5 微处理器的存储器与I/O组织 null例1:某单元的逻辑地址为4B09H:5678H,则该存储单元的物理地址为:2.5 微处理器的存储器与I/O组织 null例2:图中物理地址为00020H单元,其逻辑地址可以有: [0000H:0020H][0001H:0010H]2.5 微处理器的存储器与I/O组织 null[0002H:0000H] 由此可见,一个存储单元,若用不同的逻辑地址表示,其PA是唯一的。2.5 微处理器的存储器与I/O组织 null7.从汇编语言源程序到可执行程序所经过的处理过程用全屏幕编辑软件编辑汇 编语言源程序 文件名.ASM用汇编程序MASM.EXE对源程序 文件名.ASM 进行汇编有语法错误吗?在磁盘上形成目标程序文件 文件名.OBJ用连接程序LINK.EXE对 文件名.OBJ 进行连接有错误吗?在磁盘上形成了可执行文件 文件名.EXE 有没有没3.1 汇编语言指令null如:将(AL) 12,则有:MOV AL , 12 ;12为十进制数MOV AL , 0CH ;0CH为十六进制数MOV AL , 00001100B ;00001100B为二进制数MOV AL , 14O ; 14O为八进制数3.1 汇编语言指令null2.字符串常数 字符串常数是由单引号“ ′…… ′”括起 来的一串字符或者单个字符。BUF DB ′12Aa ′;将′12Aa′字符串定义给 ;变BUF以下连续的(4个字 ;节)存储器单元。 3.1 汇编语言指令null②逻辑操作符AND AL , 0CCH OR 0F0H3.1 汇编语言指令null③关系操作符若关系成立,则为真,取值全1; 若关系不成立,则为假,取值全0。 MOV AL , 04H LT 05H ;关系成立为真3.1 汇编语言指令null④属性操作符MOV BX , OFFSET TABLE ;BX 取变量TABLE单 元的偏移地址MOV AX , SEG TABLE ;AX 取变量TABLE单 元的段地址 MOV DL , TYPE TABLE ;DL 取变量TABLE 的类型3.1 汇编语言指令null⑤属性修改操作符 MOV WORD PTR [BX] ,02HDS:(BX)3.1 汇编语言指令null⑤属性修改操作符MOV BYTE PTR TABLE ,AL(AL)TABLE 只是在本条语句中用PTR将TABLE变量临时修改为字节型变量,脱离了本条语句,变量TABLE的类型恢复原样。3.1 汇编语言指令null3.1 汇编语言指令假设AD1的段地址为0100H,段内偏移地址为2157H 返回AD1 DB 100 DUP(?) AD2 DW AD1 ;指向变量AD1的起始地址 AD3 DW AD1+10 AD4 DD AD1 ;指向变量AD1的起始地址null变量定义举例 若(DS)=1500H,且在数据段0000H偏移地址开始有以下变量定义。3.1 汇编语言指令nullDAT1 DB 12,-12,12HDAT2 DB 2*3,$+2DAT1OCHOF4H12HO6H1500H:0000H0003H汇编程序对本段汇编后,各变量 对应存储器单元的内容如下图。此时,MASM.EXE中的软 件位置计数器$=0000HDAT23.1 汇编语言指令nullDAT1 DB 12,-12,12HDAT2 DB 2*3,$+2DAT3 DW 02H,567AHDAT1OCHOF4H12HO6H1500H:0000H0003HDAT2DAT30005H05H02HO0H7AH56H123.1 汇编语言指令nullDAT4 DD 89HDAT489H00H00H00H1500H:0009H000DHDAT5DAT6DAT5 DB ′THIS′DAT6 DW ′AB′, ′C′0011H`T``H``I``S``B`3.1 汇编语言指令`A`nullDAT6O0H1500H:0011H0015HDAT7DAT8DAT6 DW ′AB′, ′C′DAT7 DB 3 DUP (00H)DAT8 DW 3 DUP (?)0018H00H00HO0H??`B``A``C`3.1 汇编语言指令nullDAT8????1500H:0018HDAT9DAT10DAT9 DW DAT6DAT8 DW 3 DUP (?)DAT10 DD DAT8DAT11 DB ?001EH??00H11H18H0020H123.1 汇编语言指令nullDAT1 DB 12,-12,12HDAT2 DB 2*3,$+2DAT3 DW 02H,567AHDAT4 DD 89H1500H:0020HDAT10DAT5 DB ′THIS′DAT6 DW ′AB′, ′C′DAT7 DB 3 DUP (00H)DAT9 DW DAT6DAT8 DW 3 DUP (?)DAT10 DD DAT8DAT11 DB ?0024H?15H00H18H00HDAT113.1 汇编语言指令nullMOV AX , SEG DAT10 ; (AX)=1500HMOV AX , OFFSET DAT3 ; (AX)=0005HMOV AL , TYPE DAT3 ; (AL)=02H3.1 汇编语言指令nullMOV AX , LENGTH DAT3 ; (AX)=0001HMOV AX , LENGTH DAT8 ; (AX)=0003HMOV AX , SIZE DAT3 ; (AX)=0002HMOV AX , SIZE DAT8 ; (AX)=0006H以上指令中, SRC均为立即数寻址3.1 汇编语言指令nullA H A L A X操作码存储器例:MOV AX ,1234HB8H34H12H∴(AX)=1234H3.3 数据寻址方式null例:MOV AX , BX若(AX)=1234H,(BX)=5678H3.3 数据寻址方式则CPU执行上条指令后: (AX)=5678H,而(BX)不变。null例1:MOV AX,[2000H] 若DS为3000H,则:3.3 数据寻址方式null例2:MOV [2000H] ,AL 若DS为3000H,则:A L 3.3 数据寻址方式null例3:MOV ES:[2000H] ,AL 若ES为2050H,则:3.3 数据寻址方式null例4:若(DS)=1500H,TABLE为在DS段定义的一个字变量,且偏移地址为0004H。则CPU执行 MOV AX ,TABLE 指令完成的操作如下:3.3 数据寻址方式null例1:MOV AX , [BX]PA=(DS) × 10H+(BX) =30000H+1050H =31050H3.3 数据寻址方式若:DS=3000H , BX=1050H 则:SRC所在单元的物理地址为:SRC为寄存器间接寻址null操作码A H A L 31050H31051H…… ……存储器A X8BH07H3 0 0 0 0 H DS:+ 1 0 5 0 H3 1 0 5 0 H BX:PA:3.3 数据寻址方式null例2:MOV ES:[SI] , AL 指令完成的功能为: (ES:(SI)) (AL)3.3 数据寻址方式若:ES=4000H , SI=1234H,(AL)=23H则:DST所在单元的物理地址为: PA=(ES)×16+(SI) =40000H+1234H =41234H ∴指令执行后(41234H)=23H.null例1:MOV AX , [BX]+05H 其中,SRC也可以写成:PA=(DS)×10H+(BX)+05H =20000H+0008H+05H =2000DH3.3 数据寻址方式若:DS=2000H , BX=0008H, 存放操作数单元的物理地址为:nullA H A L 2000DH2000EH+…… ……存储器AX8BH47H05H2 0 0 0 0 H0 0 0 8 H2 0 0 0 D H0 0 0 5 H3.3 数据寻址方式null例2:MOV AX , [BP] 若:SS=1050H , BP=0050H, 存放操作 数的存储单元的物理地址为: PA=(SS)×10H+(BP)+00H =10500H+0050H+00H =10550H3.3 数据寻址方式nullA H A L 10550H10551H+…… ……存储器相对偏移量DISP为0,这里特别 指出,BP寄存器无间接寻址, 只不过再相对寻址时,DISP为0。1 0 5 5 0 H 0 0 5 0 H1 0 5 0 0 H3.3 数据寻址方式null例3:若(DS)=1500H,TABLE为在DS段定义的一个字 变量,且偏移地址为0004H,(BP)=0003H。3.3 数据寻址方式MOV AX ,DS:TABLE[BP]指令完成的操作为:null3.3 数据寻址方式null例1: MOV AX , [BX][DI]04 (AX) (DS:(BX+DI+04H)) 3.3 数据寻址方式null例.若(BX)=0158H , (DI)=10A5H , (DS)=2100H , DISP=1B57H , (BP)=0100H , (SS)=1100H , 段寄存器按默认段寄存器,则相对于各种寻址方式的EA的求法如下:3.3 数据寻址方式null例.若(BX)=0158H , (DI)=10A5H , (DS)=2100H , DISP=1B57H , (BP)=0100H , (SS)=1100H , 段寄存器按默认段寄存器,则相对于各种寻址方式的EA的求法如下:3.3 数据寻址方式null例.若(BX)=0158H , (DI)=10A5H , (DS)=2100H , DISP=1B57H , (BP)=0100H , (SS)=1100H , 段寄存器按默认段寄存器,则相对于各种寻址方式的EA的求法如下:3.3 数据寻址方式null例.若(BX)=0158H , (DI)=10A5H , (DS)=2100H , DISP=1B57H , (BP)=0100H , (SS)=1100H , 段寄存器按默认段寄存器,则相对于各种寻址方式的EA的求法如下:3.3 数据寻址方式null例.若(BX)=0158H , (DI)=10A5H , (DS)=2100H , DISP=1B57H , (BP)=0100H , (SS)=1100H , 段寄存器按默认段寄存器,则相对于各种寻址方式的EA的求法如下:3.3 数据寻址方式null例:若(DS)=2000H,(BX)=0100H,(SI)=0002H, (20100H)=1200H,(20102H)=1250H, 则:3.3 转移地址的寻址方式执行指令后IP的值 (IP)=0100H (IP)=1200H (IP)=1250Hnull若(DS)=3000H,(BX)=1000H,(DI)=2000H,则:…… ……33000H82000H…3.3 转移地址的寻址方式null①立即数→通用寄存器或存储单元 12343.4 数据传送类指令例1: MOV AX,1234H ;将1234H传送到AX中null① 立即数→通用寄存器或存储单元 34H 12H3.4 数据传送类指令例2: MOV var1,1234H ;将1234H传送到变量var1中null② 通用寄存器→存储单元AAH 55H3.4 数据传送类指令例3: MOV var1,DX ;将DX的内容传送到变量var1中null③ 存储单元→通用寄存器 34H 12H3.4 数据传送类指令例4: MOV DX,var2 ;将变量var2 的内容传送到DX中null④ 通用寄存器←→通用寄存器 78AD3.4 数据传送类指令例5 MOV AX,BX ;将BX的内容传送到AX中null⑤ 通用寄存器←→段寄存器1234AA503.4 数据传送类指令例6 MOV DS,AX MOV BX,ESnull⑤ 通用寄存器←→段寄存器12343.4 数据传送类指令例7 MOV DX,CS null⑥ 段寄存器←→存储单元 12343.4 数据传送类指令例8 MOV DS,var1null⑥ 段寄存器←→存储单元AAH 55H3.4 数据传送类指令例9 MOV var2,ESnull⑥ 段寄存器←→存储单元AAH 55H3.4 数据传送类指令例10 MOV var2,CS null例:判断下面指令书写是否正确。 (DATA1为字型变量) 3.4 数据传送类指令MOV [BX][SI],78Hㄨ 类型不明确MOV AL,CXㄨ 类型不一致MOV 10H,ALㄨ DST不能为立即数寻址nullㄨ 当DS作DST时,SRC 不能为立即数3.4 数据传送类指令MOV DATA1,AHㄨ 类型不一致MOV [DI]+02H,DATA1ㄨ 两单元之间不 能直接传送数据MOV CS,AXㄨ CS不能做DSTMOV DS,0100Hnull例如: LEA DI, VAR1 ;(DI) ←VAR1的偏移地址 等效于: MOV DI , OFFSET VAR1 LEA BX,VAR1+15 ;(BX) ←VAR1的偏移地址+15 等效于: MOV BX , OFFSET VAR1+253.4 数据传送类指令null3.取地址指针指令(LDS,LES) Load Data/Extra Segment Register 格式: LDS REG16,MEM ;(DS)←(MEM+2), (REG16)←(MEM) LES REG16,MEM ;(ES)←(MEM+2), (REG16)←(MEM)3.4 数据传送类指令null例如定义变量: TABLE DB 10H, 20H,…… POINT1 DD 02001000H POINT2 DD TABLE 3.4 数据传送类指令LES SI,POINT2 ; (ES)← TABLE的段地址, ; (SI)← TABLE的偏移地址 则可以有指令:LDS DI,POINT1 ;(DS) ← 0200H,(DI) ← 1000Hnull 指令LAHF(Load AH register from flags)可以将PSW寄存器中的低8位传送到寄存器AH中; 指令SAHF(Store AH register in flags)可以将AH中的内容传送到PSW寄存器中的低8位中。 源操作数和目的操作数的寻址方式均为隐含寻址方式。3.4 数据传送类指令说明:null例1 合法指令有: XCHG AX, BX ;(AX) ←→(BX) XCHG CX, [DI] ;(CX) ←→((DI)) XCHG DX, VAR1 ;(DX) ←→(VAR1)3.4 数据传送类指令null例2.判断下面指令是否正确。ㄨ两存储器单元不能直接交换3.4 数据传送类指令XCHG AX,1234Hㄨ立即数不能参加交换XCHG BX,ESㄨES段寄存不能参加交换XCHG AL,CXㄨ类型不一致XCHG DAT1,DAT2null例3.若(CX)=9A8BH,试将CX的高 8位与低8位互相交换。XCHG CH , CL 指令执行后,(CX)=8B9AH3.4 数据传送类指令null3.4 数据传送类指令例如, 当AL=0时,则执行XLAT 指令后得到 AL=15; 当AL=1时,则执行XLAT 指令后得到 AL=8。null3.4 数据传送类指令2.弹出堆栈指令(POP)说明: 弹出堆栈指令POP(Pop word off stack)可以取出堆栈的内容送入DST所指定的寄存器、存储单元或PSW,然后修正SP的内容。 DST也必须是字型的,它可以是通用寄存器、段寄存器(CS除外),也可以是存储单元,但不能是立即数。 格式: POP DST ;从堆栈弹出DST, 即(DST)←(SP),(SP) ←(SP)+2 POPF ;从堆栈弹出PSW, 即(PSW)←(SP),(SP) ←(SP)+2null3.4 数据传送类指令POP BX ;从堆栈弹出一个字,送给(BX) POP ES ;从堆栈弹出一个字,送给(ES) POP [SI] ;从堆栈弹出一个字,送给((SI)) POPF ;从堆栈弹出一个字,送给(PSW) 例:null例3:判断下列指令书写是否正确。3.4 数据传送类指令PUSH AL〤 堆栈只能按字操作PUSH 5678H〤不能为立即数寻址POP CS〤 CS不能作DSTnull3.4 数据传送类指令4.应用举例 利用堆栈操作指令可以方便地完成某些复杂操作,例:当需要交换DS和ES的内容时,可以采用: PUSH DS PUSH ES POP DS POP ESnull3.4 数据传送类指令在子程序设计时,需要从子程序返回时保持通用寄存器不变。然后在子程序返回指令之前,排入指令: POP DX POP CX POP BX POP AX 子程序调用,恢复现场例:为保持AX、 BX、 CX、 DX的内容不变,则在子程序入口处排入指令: PUSH AX PUSH BX PUSH CX PUSH DXnull3.4 数据传送类指令例:设(SP)=00A0H,执行下列指令 PUSH AX PUSH VAR1 后,(SP)= 。解:每向堆栈压入一个字,SP的内容减2,因此指令执行后(SP)= 009CH 。null3.5 算术运算类指令例如,设变量VAR1为字型变量,VAR2为字节变量,则有 ADD AX, 56A0H ;(AX) ←(AX)+56A0H ADC VAR1, 127FH ;(VAR1)←(VAR1)+127FH+(CF) ADC AX, BX ;(AX) ←(AX)+(BX) +(CF) ADD AX, VAR1 ;(AX) ←(AX)+(VAR1) ADD BX, VAR1[DI] ;(BX) ←(BX)+((VAR1+(DI)) ADD BL, VAR2 ;(BL) ←(BL)+(VAR2) ADD BYTE PTR VAR1, AL ;(VAR1的低位字节)←(VAR1的低位)+(AL)null3.5 算术运算类指令例: 设(AX)=125AH, 则执行ADD AX,78C6H后, (AX)=8B00H,CF=0,AF=1,OF=1,SF=1,ZF=0,PF=1。ADD和ADC指令会正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。null3.5 算术运算类指令例: 设在DVAR开始的连续8字节中分别存放着两个数A和B(每个数为32位),求C=A+B,并将结果C放到DVARC开始的内存中。 为完成双字相加运算,先完成低位字的加法运算,再完成高位字加法运算。算法:利用ADD指令带进位加法,用ADC指令null3.5 算术运算类指令解:设这两个数分别为A=00127654H、B=00049821H,则在数据段中有变量定义语句:DVAR DD 00127654H DD 00049821H DVARC DD ?先定义操作数LEA DI, DVARMOV AX, 4[DI]ADD AX, [DI] MOV AX, 6[DI]ADC AX, 2[DI]MOV DVARC+2, AX将变量地址送地址寄存器DI; 取低位字到(AX);低位字相加; 取高位字到(AX); 高位字相加(带进位); 保存结果的高位字MOV DVARC,AX;保存结果低位字null3.5 算术运算类指令例如,设VAR1为字型变量,VAR2为字节变量,则有SUB AL, 2CH ;(AL)← (AL)-2CH SBB AX, BX ;(AX)← (AX)-(BX)-(CF) SUB AX, VAR1 ;(AX)← (AX)-(VAR1) SUB VAR1, 2184H ;(VAR1)← (VAR1)-2184H SBB DL, VAR2[SI] ;(DL)←(DL)-((VAR2)+(SI))-(CF)null3.5 算术运算类指令减法指令SUB和SBB指令会正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。例: MOV AX,1734H SUB AX,5566H执行后有(AX)=0C1CEH CF=1,AF=1,OF=0,SF=1,ZF=0,PF=0null3.5 算术运算类指令例 设DVAR1和DVAR2保存有双字数,求DVAR1-DVAR2,并将结果保存在双字变量DVARR中。 为完成双字相减运算,应该先利用SUB指令完成低位字的减法运算,再利用SBB指令完成高位字的带进位减法运算。分析:null3.5 算术运算类指令MOV AX, DVAR1+2 ;取被减数的高位字到(AX) SBB AX, DVAR2+2 ;高位字相减(带借位相减) MOV DVARR+2, AX ;保存结果的高位字 解:设在数据段中有变量定义语句: DVAR1 DD 78127654H DVAR2 DD 12349821H DVARR DD ?MOV AX, DVAR1 ;取被减数的低位字到(AX) SUB AX, DVAR2 ;低位字相减 MOV DVARR, AX ;保存结果的低位字null3.5 算术运算类指令例:设VAR1为字型变量,则有下列指令: NEG BX ;(BX)←0-(BX) NEG VAR1 ;(VAR1)←0-(VAR1) NEG BYTE PTR 2[BX] ;((BX)+2)←0-((BX)+2)null3.5 算术运算类指令例:设VAR1为字型变量,VAR2为字节变量,则有 CMP CX, 2000 ;(CX)-2000,并置FLAG CMP BX, DX ;(BX)-(DX),并置FLAG CMP AL, VAR2 ;(AL)-(VAR2),并置FLAG CMP VAR1[SI],AX ;((VAR1)+(SI))-(AX),并置FLAG null3.5 算术运算类指令当两个无符号数进行比较时, 如果CF=0、ZF=0,则(DST)>(SRC); 如果CF=1,则(DST)<(SRC)。(一)无符号数比较null当两个有符号数进行比较时, OF=1表示运算产生了溢出 大小的比较要根据OF和SF共同来决定(二)无符号数比较3.5 算术运算类指令null3.5 算术运算类指令例: 两个无符号数(AL)=49H、(BL)=28H进行大小比较。解:指令段为: MOV AL, 49H MOV BL, 28H CMP AL, BL执行后,CF=0,说明49H>28H。如果采用CMP BL,AL语句,则CF=1,说明28H<49H。null3.5 算术运算类指令例: 两个有符号数-104、-113进行大小比较。解:当采用8位补码表示时,这两个有符号数分别为98H和8FH。程序段为: MOV AL, -104 MOV BL, -113 CMP AL, BL执行后,OF=0,SF=0,说明-104>-113。 如果采用CMP BL,AL语句,则OF=0,SF=1,这说明-113<-104。 null3.5 算术运算类指令例3.6 两个有符号数57、-113进行大小比较。解:当采用8位补码表示时,这两个有符号数分别为39H和8FH。程序段为: MOV AL, 57 MOV BL, -113 CMP AL, BL执行后,OF=1,SF=1,说明57>-113。如果采用CMP BL,AL语句,则OF=1,SF=0,这说明-113<57。null3.5 算术运算类指令例:设VAR1为字型变量,则有 DEC AX ;(AX) ← (AX) -1 INC DL ;(DL) ← (DL)+1 INC VAR1 ;(VAR1) ← (VAR1)+1 DEC WORD PTR [BX] ;((BX)) ←((BX))-1null例:判断下列指令的合法性。3.5 算术运算类指令MUL CXIMUL CLMUL AL,BLIMUL 05H〤 DST(被乘数)应为隐含寻址 〤 SRC(乘数)不能为立即数寻址(AX)←(AL)*(CL),为字节操作(DX:AX)←(AX)*(CX),为字操作null3.5 算术运算类指令例: 乘法的字节运算。要计算两个无符号数2CH、42H的乘积,结果保存在AX中。解:程序段如下: MOV AL, 2CH MOV BL, 42H MUL BL结果(AX)=0B58H,CF=1,OF=1。null3.5 算术运算类指令例: 乘法的字运算。要计算两个有符号数1000、-12345的乘积。解:程序段如下: MOV AX, 1000 MOV BX, -12345 IMUL BX执行得到结果(DX)=FF43H, (AX)=A158H,CF=1,OF=1 null3.5 算术运算类指令例: 字节×字运算。要计算两个有符号数15H、FB78H的乘积。解: 实际上,有符号数FB78H为负数(-1160)。程序段为: MOV AL, 15H CBW MOV BX, 0FB78H IMUL BX执行得到结果(DX)=FFFFH,(AX)=A0D8H,CF=0,OF=0,这表示相乘结果只需要用一个字表示。 null例.判断下列指令的合法性。 DIV BL IDIV CX DIV WORD PTR [BX][SI]3.5 算术运算类指令DIV 12〤 DST(被除数)应为隐含寻址〤 SRC(除数)不能为立即数寻址DIV [SI]+02H〤 SRC类型不明确 IDIV AX,BL null3.5 算术运算类指令例: 字÷字节的除法运算。设要完成除法运算12345÷156。解:被除数12345可以用一个字表示,除数156可以用一个字节表示,因此可以直接采用除法的字节运算。程序段为: MOV AX, 12345 MOV BL, 156 DIV BL执行结果商(AL)=4FH 余数(AH)=15Hnull3.5 算术运算类指令例: 双字÷字的除法运算。设要完成除法运算28901240H÷(-6528H)。解:这是有符号数的除法运算,被除数应该用一个双字表示,除数可以用一个字表示,程序段为: MOV AX, 1240H MOV DX, 2890H MOV BX, -6528H IDIV BX执行结果商(AX)=9959H,余数(DX)=2528H。null3.5 算术运算类指令例3.12 双字÷字节的除法运算。设要完成无符号除法运算00011240H÷0A0H。解:这是无符号数的除法运算,被除数应该用一个双字表示,除数本身可以用一个字节表示,但除法运算只能采用双字÷字,因此除数应该变换成字。对无符号数来说,这种由字节变换成字的过程,非常简单,只需要将高位字节填0。null程序段为: MOV AX, 1240H MOV DX, 0001H MOV BL, 0A0H MOV BH, 0 DIV BX执行结果商(AX)=01B6H,余数(DX)=0080H。 3.5 算术运算类指令null例.写出计算Y=a*b+c-18的程序;在数据段定义变量如下: DAT1 DB 34H ;34H为变量a的一个设定值 DAT2 DB 56H ;56H为变量b的一个设定值 DAT3 DB 0E7H ;0E7H为变量c的一个设定值 DATY DW ? ;DATY单元存放结果3.5 算术运算类指令null;在代码段编写程序 MOV AL,DAT1 ;取a MOV BL,DAT2 ;取b IMUL BL ;(AL)*(BL) → (AX) MOV BX,AX ;(AX)→ (BX) MOV AL,DAT3 ;取c CBW ;扩展AL→AX ADD AX,BX ;(AX)+(BX)→ (AX) SUB AX,18 MOV DATY,AX …Y=a*b+c-183.5 算术运算类指令null3.5 算术运算类指令例: 计算十进制数的加法运算,设要计算4+8。解:当通过键盘输入这两个十进制数时,我们得到的是其ASCII码,如果将其看作为分离BCD码,则高4位为无效部分,因此不需要将高4位清除。程序段如下: MOV AL, ‘4’ MOV BL, ‘8’ ADD AL, BL AAA AAA指令调整之前,(AL)=6CH,执行AAA指令后,其结果为(AX)=0102H,CF=1,AF=1; 这说明“4+8=12”。null3.5 算术运算类指令例:计算十进制数的加法运算,设要计算34+28。解:采用组合BCD表示数34,这时应将“34H”送入某寄存器。程序段如下:MOV AL, 34H MOV BL, 28H ADD AL, BL DAA DAA指令调整之前,(AL)=5CH,执行DAA指令后,其结果为(AL)=62H,CF=0,AF=1,SF=0,PF=0,ZF=0,这说明“34+28=62”。null3.5 算术运算类指令例3.16 计算十进制数的减法运算,设要计算5-9解:程序段如下: MOV AL, 05H MOV BL, 09H SUB AL, BL AAS AAS指令调整之前,(AL)=0CH,AF=1,执行AAS指令后,其结果为(AL)=06H,CF=1,AF=1;这说明调整结果为负数,因此结果为-4。null3.5 算术运算类指令例3.17 计算十进制数的减法运算,设要计算31-87解:程序段如下: MOV AL, 31H MOV BL, 87H SUB AL, BL DAS DAS指令调整之前,(AL)=0AAH,AF=1,CF=1,执行DAS指令后,其结果为(AL)=44H,CF=1,AF=1;这说明调整结果为负数,因此结果为-44(注意,这里读取结果的方法与AAS不同)。 null3.5 算术运算类指令例3.18 计算十进制数的乘法运算,设要计算7×8。解:程序段如下: MOV AL, 7 MOV BL, 8 MUL BL AAMAAM指令执行之前,(AX)=38H,AAM指令执行后,(AX)=0506H,SF=0,ZF=0 null3.5 算术运算类指令例3.19 计算十进制数的除法运算,设要计算27÷4。解: 程序段如下: MOV AX, 0207H MOV BL, 4 AAD ;(AX)←001BH DIV BL执行结果为AL=06H,AH=03H,这说明十进制数的除法运算27÷4的商为6,余数为3。null3.6 逻辑运算类指令 解:设VAR1为字型变量,则有: AND AX,BX ;(AX)←(AX)∧(BX) AND AL, 156 ;(AL)←(AL)∧1001 1100B (156=1001 1100B) AND VAR1, 78AAH ;(VAR1)←(VAR1)∧78AAH AND CX, [SI] ;(CX)←(CX)∧((SI))例: 求两个操作数的逻辑与。null3.6 逻辑运算类指令 例:求两个操作数的逻辑测试。解:设VAR1为字型变量,则有: TEST AL, 156 ;(AL)∧1001 1100B (156=1001 1100B) TEST VAR1, 78AAH ; (VAR1)∧78AAH TEST AX,BX ; (AX)∧(BX) TEST CX, [SI] ; (CX)∧((SI)) null3.6 逻辑运算类指令 例 求两个操作数的逻辑或。解:设VAR2为字节型变量,则有: OR AL, 0110 0001B ;(AL)←(AL) ∨0110 0001B OR VAR2, 0FH ;(VAR2)←(VAR2) ∨0FH OR AX,BX ;(AX)←(AX) ∨(BX) OR BX, [DI] ;(BX)←(BX) ∨((DI))null例: 求两个操作数的逻辑异或。 解:设VAR2为字节型变量,则有: XOR AL, 0110 0001B ;(AL)←(AL) 0110 0001B XOR VAR2, 0FH ;(VAR2)←(VAR2) 0FH XOR AX,BX ;(AX)
本文档为【微机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_974991
暂无简介~
格式:ppt
大小:4MB
软件:PowerPoint
页数:0
分类:金融/投资/证券
上传时间:2011-04-07
浏览量:23