汇编语言程序设计第05章顺序结构程序.ppt

上传人:牧羊曲112 文档编号:6053183 上传时间:2023-09-18 格式:PPT 页数:95 大小:415KB
返回 下载 相关 举报
汇编语言程序设计第05章顺序结构程序.ppt_第1页
第1页 / 共95页
汇编语言程序设计第05章顺序结构程序.ppt_第2页
第2页 / 共95页
汇编语言程序设计第05章顺序结构程序.ppt_第3页
第3页 / 共95页
汇编语言程序设计第05章顺序结构程序.ppt_第4页
第4页 / 共95页
汇编语言程序设计第05章顺序结构程序.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《汇编语言程序设计第05章顺序结构程序.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计第05章顺序结构程序.ppt(95页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计,齐志儒 高福祥 主编东北大学出版社,第五章 顺序结构程序,5.1 程序设计的步骤5.2 流程图的应用5.3 程序的基本控制结构5.4 数据传送指令5.5 算术运算指令5.6 逻辑操作指令5.7 移位操作指令5.8 状态标志位操作指令5.9 简单的I/O功能调用5.10 顺序结构程序举例,5.1 程序设计的步骤,1.分析问题2.建立数学模型3.设计算法4.编制程序5.上机调试,5.2 流程图的应用,(1)流程线(2)端点框(3)判断框(4)处理框(5)连接框,5.3 程序的基本控制结构,(1)顺序结构,(2)分支(选择)结构,(3)循环(迭代)结构,5.4 数据传送指令,数据传

2、送指令共有12条:MOV PUSHPOP XCHGXLAT LEALDS LESLAHF SAHFPUSHF POPF,指令汇编格式:MOV dest,src 操作:将一个源操作数(字节或字)传送到目标操作数中。dest(src)受影响的状态标志位:没有说明:指令中dest和src不能同时为存储器操作数;CS不能做为目标操作数使用,段寄存器之间不能互相传送,立即数不能送入段寄存器。,1.MOV(move)传送,1,1.MOV(move)传送指令(举例),MOV ALPHA_W,AXMOV BETA_B,ALMOV AL,ES:BX+SI+1000HMOV BX,1000HMOV DS,BXMO

3、V BX+10,ALMOV BX,10HMOV DS,10HMOV CS,AX,2,1.MOV(move)传送指令(举例),MOV ALPHA_W,AXMOV BETA_B,ALMOV AL,ES:BX+SI+1000HMOV BX,1000HMOV DS,BXMOV BX+10,ALMOV BYTE PTR BX,10HMOVWORD PTR BX,10H,3,2.PUSH(push word onto stack)进栈,指令汇编格式:PUSH src操作:堆栈指示器减 2 SPSP-2 将给定的操作数存放到由SP指出的栈顶中。(SP+1,SP)(src)受影响的状态标志位:没有说明:PUS

4、H指令的目标地址一定在当前堆栈中。SS内容为段基址,偏移量由堆栈指针SP指出。操作数一定是16位的寄存器或存储器操作数。,1,2.PUSH 指令举例,假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是:,PUSH AXPUSH BX,2,2.PUSH 指令举例,PUSH AXPUSH BX,3,假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是,3.POP(pop word off stack into destination)出栈,指令汇编格式:POP dest操作:(1)将堆栈栈顶中

5、存放的字传送到操作数中。dest(SP+1,SP)(2)堆栈指针加2 SPSP+2受影响的状态标志位:没有说明:目标操作数只能是16位的存储器或寄存器操作数(CS除外)。,1,3.POP 指令举例,假定在执行指令:POP CX POP DX之前,堆栈的状态如图所示。指令执行后CX,DX的内容及堆栈的状态?,2,3,3.POP 指令举例,假定SI=1234H,DI=5678H,则执行下列指令后DS,ES的内容是?,PUSHSIPUSHDIPOP DSPOP ES,4.XCHG(eXCHanGe)交换,指令汇编格式:XCHG dest,src 操作:dest的内容与src的内容互换。(dest)(

6、src)受影响的状态标志位:没有说明:dest和src不能同时为存储器操作数。段寄存器、立即数不能作为操作数。,4.XCHG指令举例,XCHG AL,BLXCHG CL,BXXCHG BL,BX+SI+10XCHG AX,AXXCHG AL,SIXCHG SI,BX+10XCHG DX,DSXCHG AL,10,2,5.XLAT(translate)转换表,指令汇编格式:XLAT操作:BX和AL内容之和指出的内存字节单元的内容送到AL中。AL(BX+AL)受影响的状态标志位:没有说明:XLAT指令用于查表。表的开始地址即表头地址由BX寄存器给出。AL中的原始值是要寻址的表中元素地址的位移量,规

7、定表中第一个字节的位移量为0。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。,看如下的一种加密方式(替代加密):A B C D E F G H I J K L M N O P QY Z D M R N H X J L I O Q U W A CR S T U V W X Y ZB E G F K P T S V明文:THIS IS A COMPUTER密文:GXJE JE Y DWQAFGRB,5.XLAT 应用举例,2,5.XLAT 应用举例,JMTAB DB YZDMRNHXJLIOQ DB UWACBEGFKPTSV MOV AX,SEG JMTAB MOV DS,

8、AX MOV BX,OFFSET JMTAB MOV AL,T;SUB AL,A MOV AH,0 ADD BX,AX MOV AL,BX,3,5.XLAT 应用举例,JMTAB DB YZDMRNHXJLIOQ DB UWACBEGFKPTSV MOV AX,SEG JMTAB MOV DS,AX MOV BX,OFFSET JMTAB MOV AL,T;SUB AL,A XLAT,5,6.LEA(load effective address)取有效地址,指令汇编格式:LEA dest,src操作:将指令中给出的存储器操作数的有效地址(即地址的偏移量)送到指定的寄存器中。destEA受影响的

9、状态标志位:没有说明:LEA指令是将源操作数地址的偏移量,即有效地址传送到目标操作数中。源操作数必须是一个存储器操作数,标操作数可以是任一16位通用寄存器、指针寄存器或变址寄存器。,1,6.LEA指令举例,DATA1 DB 10H LEA BX,DATA1 MOV BX,OFFSET DATA1 MOV BX,1000H MOV DI,2000H LEA AX,BX+1243H LEA DX,BX+SI+1234H,2,7.LDS(load data segment register)加载数据段寄存器,指令汇编格式:LDS dest,src操作:(1)将双字长存储器操作数中的低地址字传送到指定

10、的寄存器中。dest(EA)(2)将双字长存储器操作数中的高地址字传送到DS寄存器中。DS(EA+2)受影响的状态标志位:没有说明:LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,LDS指令将其传送到数据段寄存器DS中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。,8.LES(load data segment register)加载附加段寄存器,指令汇编格式:LES dest,src操作:(1)将双字长存储器操作数中的低地址字传送到指定的寄存器中。dest(EA)(2)将双字

11、长存储器操作数中的高地址字传送到ES寄存器中。ES(EA+2)受影响的状态标志位:没有说明:LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,LDS指令将其传送到附加段寄存器ES中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。,9.LAHF(load AH from flags)取标志,指令汇编格式:LAHF操作:标志寄存器低8 位的状态标志填写在AH寄存器相应位中。AHSF:ZF:AF:PF:CF受影响的状态标志位:没有说明:此指令在80 x86中几乎无用,主要是为了保证与80

12、80/8085向下兼容,才保留了该指令.,10.SAHF(store AH into flags)存标志,指令汇编格式:SAHF操作:将AH寄存器中的相应位传送到状态标志寄存器相应位中。SF:ZF:AF:PF:CFAH受影响的状态标志位:SF,ZF,AF,PF,CF说明:此指令在80 x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令.,11.PUSHF(push flags onto stack)标志进栈,指令汇编格式:PUSHF操作:将堆栈指针减2,然后将标志寄存器F中的值存储到栈顶字的对应位中;SPSP-2(SP+1,SP)F 受影响的状态标志位:没有,12.P

13、OPF(pop flags off stack)标志出栈,指令汇编格式:POPF操作:将位于堆栈栈顶字中的对应位写入标志寄存器F中,然后将堆栈指针加2。F(SP+1,SP)SPSP+2受影响的状态标志位:所有标志位,5.5 算术运算指令,5.5.1 加法运算指令5.5.2 减法运算指令5.5.3 乘法运算指令5.5.4 除法运算指令,5.5.1 加法运算指令,1.ADD(addition)加法2.ADC(addition with carry)带进位加3.INC(increment by 1)增1,1.ADD(addition)加法,指令汇编格式:ADD dest,src操作:两个操作数求和,

14、结果存目标操作数中。dest(dest)+(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:dest和src不能同时为存储器操作数和段寄存器。例:ADD AL,3 ADD CX,MEM_W ADD GAMABPDI,BL ADD BP+DI+OFFSET GAMA,BL,2.ADC(addition with carry)带进位加法,指令汇编格式:ADC dest,src操作:两个操作数相加的同时,再加上CF。结果存入目标操作数中。dest(dest)+(src)+CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:ADC指令主要用于多精度数据相加。例:ADC

15、AL,3 ADC DX,BX+10,2.ADC 指令应用,3字节数据相减:123456H+789ABCH=8ACF12H,MOV AL,56HMOV AH,34HMOV BL,12HADD AL,0BCHADC AH,9AHADC BL,78H,2.ADC 指令应用,3字节数据相减:123456H+789ABCH=8ACF12H,MOV AL,56HMOV AH,34HMOV BL,12HADD AL,0BCHADC AH,9AHADC BL,79H,MOV AX,3456H,ADD AX,9ABCH,3.INC(increment by one)增1,指令汇编格式:INC dest操作:将指

16、定的操作数加1,并将结果回送到目标操作数中。dest(dest)+1受影响的状态标志位:OF,SF,ZF,AF,PF说明:INC 指令不影响CF。例:INC AL INC BX INC DATA1 INC BX,3.INC(increment by one)增1,指令汇编格式:INC dest操作:将指定的操作数加1,并将结果回送到目标操作数中。dest(dest)+1受影响的状态标志位:OF,SF,ZF,AF,PF说明:INC 指令不影响CF。例:INC AL INC BX INC DATA1 INC BX,INC WORD PTRBX,5.5.2 减法运算指令,1.SUB(subtract

17、)减法2.SBB(subtract with borrow)带借位加3.DEC(decrement by 1)减14.NEG(negate)取补5.CMP(compare)比较,1.SUB(subtract)减法,指令汇编格式:SUB dest,src操作:从目标操作数减去源操作数,结果存入目标操作数中。dest(dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF例:SUB AL,10H SUB AL,BX+10H SUB AL,AL,2.SBB(subtract with borrow)带借位减法,指令汇编格式:SBB dest,src操作:从目标操作数中减去源操作

18、数和CF,结果存入目标操作数中。dest(dest)-(src)-CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:SBB 指令主要用于多精度数据减法。例:SBB AL,0 SBB DL,CL,3.DEC(decrement by one)减1,指令汇编格式:DEC dest操作:将指定的操作数减1,并将结果送回到目标操作数中。dest(dest)-1受影响的状态标志位:OF,SF,ZF,AF,PF说明:DEC指令不影响CF。例:DEC BX DEC BYTE PTR BX+SI+1000H DEC SP,4.NEG(negate)取补(取负),指令汇编格式:NEG dest操作

19、:从0中减去指令中给定的操作数,最后将结果送回到给定的操作数中。dest0-(dest)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:NEG 指令对于带符号的数来说是取负,即改变操作数的符号.例:NEG AX NEG BYTE PTR BX+10,5.CMP(compare)比较,指令汇编格式:CMP dest,src操作:从目标操作数中减去源操作数(dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:CMP 将两个操作数相减,两个操作数保持原值不变,但与SUB指令一样影响标志。例:CMP AL,BL CMP DL,10H,5.5.3 乘法运算指令,

20、乘法指令共有两条,分别对应无符号整数的乘法和带符号整数的乘法.,1.MUL(multiply,unsigned)无符号乘法2.IMUL(integer multiply,signed)带符号乘法,1.MUL 无符号乘法,指令汇编格式:MUL src操作:源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数据相乘,乘积为字,存放在AX中。如果源操作数是字数据,就与AX中的数相乘,乘积为双字,存放在DX和AX中。两个字节数相乘:AXAL*(src)两个字数据相乘:DX,AXAX*(src)受影响的状态标志位:OF,CF说明:源操作数src不能是立即数。如果乘积的高半部 不为零时,CF

21、和OF被置位,否则将被清除。,1.MUL 无符号乘法,AX,src,AX,DX,例:MUL BL MUL DX MUL BYTE PTR SI+BX+1000H,2.IMUL 带符号乘法,指令汇编格式:IMUL src操作:将源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数相乘,乘积为字,存放在AX中。如果源操作数是字数据,那么就与AX数相乘,乘积为双字,存放在DX和AX中。两个字节数相乘:AXAL*(src)两个字数据相乘:DX,AXAX*(src)受影响的状态标志位:OF,CF。说明:src不能是立即数。IMUL指令视操作数为带符号的数。如果乘积的高半部不是符号位的扩展时

22、,CF和OF被置位,否则将被清除。,5.5.4 除法运算指令,1.DIV(division,unsigned)无符号除法2.IDIV(division,signed)带符号除法3.CBW(convert byte to word)将字节转换为字4.CWD(convert word to double word)将字转换为双字,1.DIV(division,unsigned)无符号除法,指令汇编格式:DIV src操作:AX(或DX,AX)的内容除以src的内容。商存放在AL(字节时)或AX(字时),并将余数存放在AH(字节时)或DX(字时)中。字除以字节:AX/(src);AL商,AH余数双字

23、除以字:DX,AX/(src);AX商,DX余数受影响的状态标志位:不产生有效的状态标志。说明:src不能是立即数;如果商数超过了允许的最大值(字节时为0FFH,字时为0FFFFH)时就产生一个方式0 的中断,并且商和余数都不确定。,1.DIV(division,unsigned)无符号除法,1.DIV(division,unsigned)无符号除法举例,DIV BLDIV WORD PTR BX+DI+1000HMOV AX,1000HMOV CL,08HDIV CL,2.IDIV(division,signed)带符号除法,指令汇编格式:IDIV src操作:AX(或DX,AX)的内容除以

24、src的内容。商存放在AL(字节时)或AX(字时),并将余数存放在AH(字节时)或DX(字时)中。字除以字节:AX/(src);AL商,AH余数双字除以字:DX,AX/(src);AX商,DX余数受影响的状态标志位:不产生有效的状态标志。说明:src不能是立即数;如果商数超过了允许的最大值(字节时为-128127,字时为-3276832767)时就产生一个方式0的中断,并且商和余数都不确定。,乘除法指令的应用扩充,乘法指令能实现:BYTEBYTE=WORD WORDWORD=DORD除法指令能实现:WORD/BYTE=BYTE DWORD/WORD=WORD如何实现:WORDBYTE BYTE

25、/BYTE WORD/WORD,乘除法指令的应用扩充,乘法指令能实现:BYTEBYTE=WORD WORDWORD=DORD除法指令能实现:WORD/BYTE=BYTE DWORD/WORD=WORD如何实现:WORDBYTE BYTE/BYTE WORD/WORD,WORD,DWORD,字节/字转换为字/双字(无符号数),无符号:字节转换为字(ALAX):MOV AH,0字转换为双字(AXDX:AX):MOV DX,0带符号:字节转换为字(ALAX)正数:MOV AH,0 负数:MOV AH,0FFH 字转换为双字(AXDX:AX)正数:MOV DX,0 负数:MOV DX,0FFFFH,3

26、.CBW(convert byte to word)字节转换为字,指令汇编格式:CBW操作:将AL中第7位的值扩展到整个AH中。如果AL为正,那么AH00H 否则 AH0FFH受影响的状态标志位:没有说明:CBW 是将AL寄存器中数的符号位扩展到整个AH寄存器中。,4.CWD(convert word to double word)字转换为双字,指令汇编格式:CWD操作:将AX中的最高位扩展到整个DX中。如果 AX 为正,那么 DX 0000H 否则 DX 0FFFFH受影响的状态标志位:没有说明:CWD将寄存器AX的符号位扩展到整个寄存器DX中。,5.6逻辑操作指令,1.NOT(not,or

27、 form 1s complement)取反2.AND(and,logical conjunction)逻辑与3.OR(or,inclusive)逻辑或4.XOR(exclusive or)异或5.TEST(test,or logical compare)测试,1.NOT 取反,指令汇编格式:NOT dest操作:将操作数的每一位求反,然后将结果回送到对应位中。destdest 受影响的状态标志位:没有例:NOT AX NOT WORD PTR BX+SI+1000H,2.AND 逻辑与,指令汇编格式:AND dest,src操作:两个操作数进行逻辑“与”,即如果两个操作数的对应位都为1时,结

28、果的对应位才为1,否则结果的对应位为0。dest(dest)(src),CF0,OF0受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:AND指令可借助某个给定的操作数将另一个操作数中的某些位清除(这种操作也称设置屏蔽),使某些位保持不变,这个数通常称为掩码。例如,将一个源操作数与00001111B 相“与”,可将这个源操作数的高尼伯变为0,而低尼伯保持不变。例:AND AL,0FH AND AL,BX AND DX,DX,3.OR 逻辑或,指令汇编格式:OR dest,src操作:两个操作数进行逻辑“或”操作,即当两个操作数的对应位都为0时结果的对应位为0,否则结果的对应位为1,结

29、果存入目标操作数中,CF和OF位置0。dest(dest)(src),CF0,OF0受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:OR指令可用来使操作数中的某些位为1,某些位保持不变。例如,用10000000B与一个 字节操作数相“或”,可使这个字节操作数的最高有效位为1。例:OR AL,0FH OR AL,AL OR AL,BX+DI+10,4.XOR 异或,指令汇编格式:XOR dest,src操作:两个操作数执行逻辑“异或”操作,即当两个操作数的对应位相同时,结果的对应位为0;否则结果的对应位为1。结果存入目标操作数中,CF和OF位置0。dest(dest)(src),CF

30、0,OF0受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:XOR指令可用来使操作数中的某些位取反,某些位不变。例:XOR AL,0FH XOR AX,AX,5.TEST 测试,指令汇编格式:TEST dest,src操作:将两个操作数进行逻辑“与”,根据结果设置状态标志位,但不改变两个操作数的原始值,并将CF和OF清除。(dest)(src),CF0,OF0受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:TEST指令通过“与”的方式对两个源操作数进行比较,但不保留“与”的结果。,5.7 移位操作指令,移位指令共有7条,可以对字节或字操作数移位。分别为逻辑移位(SHL,S

31、HR),算术移位(SAL,SAR),不带进位循环移位(ROL,ROR)和带进位循环移位(RCL,RCR)。说明:dest可以是任一通用寄存器,也可以是各种寻址方式给出的内存单元,cnt为移位次数。移位操作是将给定的目标操作数移动cnt次。cnt可以为1,也可以是CL的内容。SHL/SAL,SHR,SAR 影响CF,OF,PF,SF,ZF;ROL,ROR,RCL,RCR 仅影响CF和OF位。CF的值总是最后一次被移入的值。在移动 1位的移位中,如果源操作数的最高位(符号位)改变了,那么OF就被置1,否则,OF就被置0。左移时,最高位送入CF,右移时,最低位送入CF。,5.7 移位操作指令,Rot

32、ate Shift Left Right,SHR AX,1 ROR BYTE PTR BX,CL,5.8 状态标志位操作指令,8086/8088有7条状态标志位控制指令,它们可以直接和独立地对8086 CPU中的某一状态标志位进行控制,用来设置或改变状态标志位的状态。清0 置1 取反 CF CLC STC CMC DF CLD STD IF CLI STI,5.9 简单的I/O功能调用,1.键盘输入 调用方法:MOV AH,01H INT 21H功能:从键盘上接收一个字符,并在屏幕上显示出来。入口条件:无出口条件:键入字符的ASCII码在AL中。,5.9 简单的I/O功能调用,2.显示器输出调

33、用方法:MOV AH,02H INT 21H功能:在屏幕上光标处显示一个字符。入口条件:要显示的字符的ASCII码在DL中。出口条件:字符显示在屏幕上。例:在屏幕上显示A,用下述程序段实现:MOV DL,41H;字符A的ASCII码 MOV AH,02H INT 21H 注意,使用这个功能调用后,AL的内容将被改变。,5.9 简单的I/O功能调用,3.程序结束退出调用方法:MOV AH,4CH MOV AL,0 INT 21H功能:结束程序运行,返回操作系统。入口条件:AL=返回码出口条件:无欲使程序结束运行时,使用本功能,5.9 简单的I/O功能调用,4.设置断点调用方法:INT 3功能:停

34、止程序运行,返回DEBUG。入口条件:无出口条件:无 欲使程序结束运行而想检查运行结果时,则不应退出DEBUG,这时使用本功能。在以后上机实验时,多数是使用本功能来结束程序运行。,5.10 顺序结构程序举例例5.1,例5.1 计算y=-x。设x为三个字节长的数据,存于DATA1开始的单元。结果存入DATA2开始的单元。计算-x,就是对x取补。,5.10 顺序结构程序举例例5.1,取补的概念:一个数据取补,就是将这个数据包括符号位在内取反加1,或者用0 减去这个数据。带符号数据在机内用补码形式表示时,若原数据为负数,经取补操作后变为其绝对值,若原数据为正数,经取补操作后变为绝对值与其相等的负数。

35、取补与补码是两个不同的概念,一个数据的补码,是用补码形式表示这个数据,当数据为正时,它的补码就是数据本身;当数据为负时,把其原码表示形式除符号位外取反加1 或者将其绝对值进行取补所得结果为其补码。例如,用一个字节(8位二进制位)表示数据 已知:N1=00000101,取补后N1=11111011 N2=11111011,取补后N2=00000101,5.10 顺序结构程序举例例5.1,分析,将数据分为三种情况:(1)最低字节不为0时,将最低字节取补,高、中字节取反;NOT,NOT,NEG例如:01001100 00111100 00010000按位取反后:10110011 11000011 1

36、1101111再+1:10110011 11000011 11110000(2)最低字节为0,中间字节非0,则中间节和低字节取补,高字节取反;NOT,NEG,NEG(3)中间字节与低字节均为0 时,3个字节均取补。NEG,NEG,NEG,5.10 顺序结构程序举例例5.1,算法:(1)最低字节取补;(2)进位取反;(3)中间字节取反,取反的结果加进位;(4)高字节取反,取反结果加进位。,5.10 顺序结构程序举例例5.1,(1)最低字节取补;(2)进位取反;(3)中间字节取反,取反的结果加进位;(4)高字节取反,取反结果加进位。,低字节不为0,低字节为0,中字节不为0,中低字节为0,高字节不为

37、0,NEG,CF=1,CF=0,NOT+0CF=0,NOT+0,NEG,CF=0,CF=1,NOT+1=NEGCF=0,NOT+0,NEG,CF=0,CF=1,NOT+1=NEGCF=1,NOT+1=NEG,5.10 顺序结构程序举例例5.1,1:;*EXAM 5.1.1*2:SSEGSEGMENT STACK;堆栈段3:STK DB 20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT;数据段6:DATA1 DB 35H,26H,03H;(032635H)7:DATA2 DB 3 DUP(0)8:DSEG ENDS9:CSEG SEGMENT;代码段 10:ASSUME CS

38、:CSEG,DS:DSEG11:ASSUME SS:SSEG12:MBNEG:MOV AX,DSEG;段寄存器初值13:MOV DS,AX14:MOV AX,SSEG15:MOV SS,AX16:MOV SP,SIZE STK;设置堆栈指,5.10 顺序结构程序举例例5.1,17:MOVAL,DATA1;读入数据低字节 18:MOVAH,DATA1+1;读入数据中字节19:MOVBL,DATA1+2;读入数据高字节 20:NEGAL;取补低字节21:CMC;进位取反22:NOTAH;中字节取反23:ADCAH,0;加进位24:NOTBL;高字节取反25:ADCBL,0;加进位 26:MOVDA

39、TA2,AL;保存结果 27:MOVDATA2+1,AH28:MOVDATA2+2,BL29:MOVAX,4C00H30:INT21H31:CSEGENDS32:ENDMBNEG,5.10 顺序结构程序举例例5.1,17:MOVAL,DATA1;读入数据低字节 18:MOVAH,DATA1+1;读入数据中字节19:MOVBL,DATA1+2;读入数据高字节 20:NEGAL;取补低字节21:CMC;进位取反22:NOTAH;中字节取反23:ADCAH,0;加进位24:NOTBL;高字节取反25:ADCBL,0;加进位 26:MOVDATA2,AL;保存结果 27:MOVDATA2+1,AH28

40、:MOVDATA2+2,BL29:MOVAX,4C00H30:INT21H31:CSEGENDS32:ENDMBNEG,MOVAX,WORD PTR DATA1,MOVWORD PTR DATA2,AX,5.10 顺序结构程序举例例5.1,17:LEASI,DATA1;取原数据首址18:LEADI,DATA2;取存放结果首址19:MOVAX,SI;读入数据中低字节20:NEGAX21:CMC22:INCSI;地址指针增量23:INCSI24:MOVBL,SI;读入数据高字节25:NOTBL26:ADCBL,027:MOVDI,AX;存放结果中低字节28:INCDI 29:INCDI 30:MO

41、VDI,BL;存放结果高字节 31:MOVAX,4C00H33:INT21H33:CSEGENDS34:ENDMBNEG,使用寄存器间接寻址方式,ADD SI,2,?,ADD DI,2,5.10 顺序结构程序举例例5.1,17:LEASI,DATA1;取原数据首址18:LEADI,DATA2;取存放结果首址19:MOVAX,SI;读入数据中低字节20:NEGAX21:CMC22:INCSI23:INCSI24:MOVBL,SI;读入数据高字节25:NOTBL26:ADCBL,027:MOVDI,AX;存放结果中低字节28:INCDI 29:INCDI 30:MOVDI,BL;存放结果高字节 3

42、1:MOVAX,4C00H33:INT21H33:CSEGENDS34:ENDMBNEG,MOV BL,SI+2,MOV DI+2,BL,使用变址寻址方式,5.10 顺序结构程序举例例5.1,17:LEASI,DATA1;取原数据首址18:LEADI,DATA2;取存放结果首址19:MOVAX,SI;读入数据中低字节20:NEGAX21:CMC24:MOVBL,SI+2;读入数据高字节25:NOTBL26:ADCBL,027:MOVDI,AX;存放结果中低字节30:MOVDI+2,BL;存放结果高字节 31:MOVAX,4C00H33:INT21H33:CSEGENDS34:ENDMBNEG,

43、使用变址寻址方式(DI=SI+3),MOV SI+3,AXMOV SI+5,BL,5.10 顺序结构程序举例例5.1,换个算法(0-X),17:LEASI,DATA1;取原数据首址18:MOVAX,0;AX清019:SUB AX,SI20:MOV SI+3,AX21:MOVBL,0;读入数据高字节22:SBBBL,SI+223:MOVSI+5,BL;存放结果高字节 24:MOVAX,4C00H25:INT21H26:CSEGENDS27:ENDMBNEG,XOR AX,AX,XOR BL,BL,5.10 顺序结构程序举例例5.1,换个算法(0-X),17:LEASI,DATA1;取原数据首址1

44、8:MOVAX,0;AX清019:SUB AX,SI20:MOV SI+3,AX21:MOVBL,0;读入数据高字节22:SBBBL,SI+223:MOVSI+5,BL;存放结果高字节 24:MOVAX,4C00H25:INT21H26:CSEGENDS27:ENDMBNEG,XOR AX,AX,XOR BL,BL,3BYTE,4T2BYTE,3T,2BYTE,4T2BYTE,3T,5.10 顺序结构程序举例例5.1,17:MOVAX,WORD PTR DATA1 19:SUB WORD PTR DATA2,AX20:MOV AL,DATA1+221:SBBDATA2+2,AL24:MOVAX

45、,4C00H25:INT21H26:CSEGENDS27:ENDMBNEG,换个算法(0-X,利用结果单元已经是0),5.10 顺序结构程序举例例5.2,例5.2 设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数,并存入HEX和HEX+1单元的低4位,HEX存放高位十六进制数,HEX+1单元存放低位十六进制数。,5.10 顺序结构程序举例例5.2,1:;*EXAM 5.2*2:SSEGSEGMENT STACK3:STKDB 20 DUP(0)4:SSEGENDS5:DSEGSEGMENT6:DATADB0B5H7:HEXDB0,08:DSEGENDS9:CSEGSEG

46、MENT10:ASSUME CS:CSEG,DS:DSEG11:ASSUME SS:SSEG12:DISC:MOV AX,DSEG13:MOV DS,AX14:MOV AX,SSEG15:MOV SS,AX16:MOV SP,LENGTH STK,17:MOV AL,DATA;取数据18:MOV AH,AL;保存副本 19:AND AL,0F0H;截取高4位20:MOV CL,04 21:SHR AL,CL;移至低4位22:MOV HEX,AL23:AND AH,0FH;截取低4位24:MOV HEX+1,AH25:MOV AX,4C00H26:INT 21H27:CSEG ENDS28:EN

47、D DISC,5.10 顺序结构程序举例例5.3,例5.3 设HEX,HEX+1 单元的低4位分别存放一位十六进制数,编制程序将其装配在一个字节中并存入DATA单元。HEX单元中数据做为高位部分。,5.10 顺序结构程序举例例5.3,1:;*EXAM 5.3*2:SSEG SEGMENT STACK3:STK DB 20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:HEX DB 0AH,06H7:DATA DB 08:DSEG ENDS9:CSEG SEGMENT10:ASSUME CS:CSEG,DS:DESG11:ASSUME SS:SSEG12:PACK:MOV A

48、X,DSEG13:MOV DS,AX14:MOV AX,SSEG15:MOV SS,AX16:MOV SP,SIZE STK,17:MOVAL,HEX;取数据高序位18:MOVCL,0419:SHLAL,CL;左移4位20:ORAL,HEX+1;与低4位或21:MOVDATA,AL;保存结果22:MOVAX,4C00H23:INT21H24:CSEG ENDS25:ENDPACK,5.10 顺序结构程序举例例5.4,例5.4 计算Y=5X+8,设X为无符号字节数据,且在ARGX单元存放。计算结果,存入RLTY单元。,5.10 顺序结构程序举例例5.4,1:;*EXAM 5.4*2:SSEG S

49、EGMENTSTACK3:STK DB20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:ARGX DB157:RLTY DW08:DSEG ENDS9:CSEG SEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:CALCU:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,LENGTH STK,17:MOVAL,ARGX;取原始数18:MOVBL,0519:MULBL;计算5x20:MOVBX,0821:ADDAX,BX;再加上822:MOVRLTY,AX;保存结果

50、23:MOVAX,4C00H24:INT21H25:CSEG ENDS26:ENDCALCU,XOR AH,AHMOV BX,AXSHL AX,1SHL AX,1ADD AX,BX,4,7077,32223,5.10 顺序结构程序举例例5.5,例5.5 用查表的方法将HEX单元中低4位十六进制数转换为对应的ASCII码,并显示出来。,09:+30H AF:+37H,5.10 顺序结构程序举例例5.5,1:;*EXAM 5.5.1*2:SSEG SEGMENTSTACK3:STK DB20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:HATAB DB30H,31H,32H,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号