IBMPC汇编语言程序设计课后习题答案第二版 沈美明.docx

上传人:太** 文档编号:97905005 上传时间:2024-07-08 格式:DOCX 页数:75 大小:36.69KB
返回 下载 相关 举报
IBMPC汇编语言程序设计课后习题答案第二版 沈美明.docx_第1页
第1页 / 共75页
IBMPC汇编语言程序设计课后习题答案第二版 沈美明.docx_第2页
第2页 / 共75页
点击查看更多>>
资源描述

《IBMPC汇编语言程序设计课后习题答案第二版 沈美明.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序设计课后习题答案第二版 沈美明.docx(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第五章5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, a;输入字符 匕吗?JB STOPCMP AL, z;输入字符z吗?JA STOPSUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可MOV DL, AL ;显示一个字符的DOS调用MOV AH, 2INT 21HJMP BEGINSTOP: RETLEA DI, ARRAY2BEGIN1: MOV AX, BXCMP AX, 0 ;是负数码?JS FUSHUMOV SI,

2、 AX ;是正数,存入正数数组INC COUNT 1 ;正数个数+1ADD SI, 2JMP SHORT NEXTFUSHU: MOV DI, AX ;是负数,存入负数数组INC C0UNT2 ;负数个数+1ADD DI, 2NEXT: ADD BX, 2LOOP BEGIN1LEA DX, ZHEN ;显示正数个数CALL DISPLAY ;调显示子程序LEA DX, FU ;显示负数个数MOV AL, COUNT2CALL DISPLAY ;调显示子程序RETMAIN ENDPDISPLAY PROC NEAR ;显示子程序MOV AH, 9 ;显示一个字符串的DOS调用INT 21HAA

3、M ;将(AL)中的二进制数转换为二个非压缩BCD码ADD AH, O;变为 09 的 ASCII 码INT 21HADD AL, ,0;变为 09 的 ASCH 码MOV DL, ALMOV AH, 2 ;显示一个字符的DOS调用INT 21HLEA DX, CRLF ;显示回车换行MOV AH, 9 ;显示一个字符串的DOS调用INT 21HRETDISPLAY ENDP ;显示子程序结束CSEG ENDS ;以上定义代码段END START5.7 试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最 小偶数,并把它存放在AX中。答:程序段如下:BEGIN: MOV BX,

4、0MOV CX, 100COMPARE: MOV AX, DATABX;取数组的第一个偶数ADD BX, 2TEST AX, 01H ;是偶数吗?LOOPNZ COMPARE ;不是,比较下一个数JNZ STOP ;没有偶数,退出JCXZ STOP ;最终一个数是偶数,即为最小偶数,退出COMPARE 1: MOV DX, DATABX;取数组的下一个偶数ADD BX, 2TEST DX, 01H ;是偶数吗?JNZ NEXT ;不是,比较下一个数CMP AX, DX ; (AX) (DX)吗?JLE NEXTMOV AX, DX ; (AX) (DX),则置换(AX)为最小偶数NEXT: L

5、OOP COMPARE1STOP: RET5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字 节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该 数(即11B的个数)在终端上显示出来。答:程序段如下:BEGIN: MOV DL, 0 ;计数初始值MOV CX, 8COMPARE: TEST AX, 03H ;是数 03 吗?JNZ NOEQUAL ;不是,转走INC DL ;是,计数NOEQUAL: ROR AX, 1 ;准备推断下一个数ROR AX, 1LOOP COMPAREADD DL, (T ;将计数值转换为ASCH码MOV AH, 2 ;进行显示I

6、NT 21HSTOP: RET5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数, 并在终端上显示与它等值的二进制数。答:程序段如下:BEGIN: MOV BX, 0 ;用于存放四位的16进制数MOV CH, 4MOV CL, 4INPUT: SHL BX, CL ;将前面输入的数左移4位MOV AH, 1 ;从键盘取数INT 21HCMP AL, 30H ; 0 吗?JB INPUT ;不是0F的数重新输入CMP AL, 39H ;是 09吗?JA AF ;不是,转”。的处理AND AL, OFH ;转换为:0000B1001BJMP BINARYAF: AND AL, 11

7、01 HUB ;转换为大写字母CMP AL, 41H ;又 A 吗?JB INPUT ;不是丁的数重新输入CMP AL, 46H ;F 吗?JA INPUT ;不是AF的数重新输入AND AL, OFH ;转换为:1010BHUBADD AL, 9BINARY: OR BL, AL ;将键盘输入的数进行组合DEL CHJNZ INPUTDISPN: MOV CX, 16 ;将16位二进制数一位位地转换成ASCII码显示DISP: MOV DL, 0ROL BX, 1RCL DL, 1OR DL, 30HMOV AH, 2 ;进行显示INT 21HLOOP DISPSTOP: RET5. 10设

8、有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程 序,查对单词SUN在该文中的出现次数,并以格式“SUN: xxxx”显示出 次数。答:程序如下:DSEG SEGMENTENG DB Here is sun, sun,$DISP DB SUN:DAT DB 0000 ,ODH, OAH, 飞KEYWORD DB sunDSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEG, ES: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;

9、给 DS 赋值MOV ES, AX ;给 ES 赋值BEGIN: MOV AX, 0MOV DX, DISP-ENG-2 ;计算ENG的长度(每次比较sun,因此比较次数-2)LEA BX, ENGCOMP: MOV DI, BXLEA SI, KEYWORDMOV CX, 3REPE CMPSB ;串比较JNZ NOMATCHINC AX ;是,SUN的个数加1ADD BX, 2NOMATCH: INC BX ;指向ENG的下一个字母DEC DXJNZ COMPDONE: MOV CH, 4 ;将次数转换为16进制数的ASCII码MOV CL, 4LEA BX, DAT ;转换结果存入DAT

10、单元中DONE1: ROL AX, CLMOV DX, AX5.2编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续 字符,再按依次显示这三个字符。答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, a;输入字符 匕吗?JB STOPCMP AL, z;输入字符z吗?JA STOPDEC AL ;得到前导字符MOV DL, AL ;准备显示三个字符MOV CX, 3DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用INT 21HINC DLAND DL, OFH ;取一位16进制数ADD DL, 30HCMP

11、DL, 39HJLE STOREADD DL, 07H ;是“AF”所以要加7STORE: MOV BX, DL ;转换结果存入DAT单元中INC BXDEC CHJNZ DONE1DISPLAY: LEA DX, DISP ;显示字符串程序(将DISP和DAT一起显示)MOV AH, 09HINT 21HRETMAIN ENDPCSEG ENDS ;以上定义代码段END START5.11从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。答:程序段如下:DSEG SEGMENTBUFF DB 50 DUP ()COUNT DW 0DSEG ENDS BEGI

12、N: LEA BX, BUFFMOV COUNT, 0INPUT: MOV AH, 01 ;从键盘输入一个字符的功能调用MOV BX, ALINC BXCMP AL, $;是$结束符吗?JNZ INPUT ;不是,接着输入LEA BX, BUFF ;对非数字字符进行计数NEXT: MOV CL, BXINC BXCMP CL, $;是$结束符,则转去显示JZ DISPCMP CL, 30H ;小于0是非数字字符JB NEXTCMP CL, 39H ;大于9是非数字字符JA NEXTINC COUNT ;个数+1JMP NEXTDISP: : ; 16进制数显示程序段(省略) 5. 12有一个首

13、地址为MEM的100D字数组,试编制程序删除数组中全部为0的项,并将后续项向前压缩,最终将数组的剩余部分补上0。答:程序如下:DSEG SEGMENTMEM DW 100 DUP (?)DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV SI, (100-1)*2 ; (SI)指向MEM的末元素的首地址MOV BX, -2 ;地址指针的初值MOV CX, 100CO

14、MP: ADD BX, 2CMP MEM BX, 0JZ CONSLOOP COMPJMP FINISH ;比较完了,已无0则结束CONS: MOV DI, BXCONSl: CMP DI, SI ;到了最终单元码?JAE NOMOVMOV AX, MEM DI+2;后面的元素向前移位MOV MEM DI, AXADD DI, 2JMP C0NS1NOMOV: MOV WORD PTR SI, 0 ;最终单元补 0LOOP COMPFINISH: RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 13在STRING到STRING+99单元中存放着一个字符串,试

15、编制一个程序 测试该字符串中是否存在数字,如有则把CL的第5位置1,否则将该位置Oo答:程序如下:DSEG SEGMENTSTRING DB 100 DUP (?)DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV SI, 0 ; (SI)作为地址指针的变更值MOV CX, 100REPEAT: MOV AL, STRING SIJB GO_ONCMP AL, 39

16、HJA GO_ONOR CL, 2OH ;存在数字把CL的第5位置1JMP EXITGO_ON: INC SILOOP REPEATAND CL, ODFH ;不存在数字把CL的第5位置0EXIT: RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 14在首地址为TABLE的数组中按递增次序存放着100H个16位补码数, 试编写一个程序把出现次数最多的数与其出现次数分别存放于AX和CX中。答:程序如下:DSEG SEGMENTTABLE DW 100H DUP (?);数组中的数据是按增序排列的DATA DW ?COUNT DW 0DSEG ENDSCSEG

17、SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV CX, 1OOH ;循环计数器MOV SI, 0NEXT: MOV DX, 0MOV AX, TABLE SICOMP: CMP TABLE SI, AX ;计算一个数的出现次数JNE ADDRINC DXADD SI, 2LOOP COMPADDR: CMP DX, COUNT ;此数出现的次数最多吗?JLE DONEMOV COUNT, DX ;目前此数出现

18、的次数最多,登记次数STOP: RET5. 3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。答:程序段如下:DSEG SEGMENTSTORE DB 4 DUP (?)DSEG ENDS 1 1BEGIN: MOV CL, 4 ;右移四次MOV CH, 4 ;循环四次LEA BX, STOREA10: MOV DX, AXAND DX, OFH ;取AX的低四位MOV BX, DL ;低四位存入STORE中INC BXMOV DATA, AX ;登记此数DONE: LOOP NEXT ;准备取下一个数MOV CX, COUNT ;出现最多的次数存入

19、(CX)MOV AX, DATA ;出现最多的数存入(AX)RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5.15数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M 中确定值最大的数,把它放在数据段的M+2rl单元中,并将该数的偏移地 址存放在M+2 (n+1)单元中。答:程序如下:DSEG SEGMENT n EQU 100H ;假设 n=100HM DW n DUP (?)DATA DW ? ; M+2n 单元ADDR DW ? ; M+2(n+l)单元DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSE

20、G, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值LEA DI, MMOV AX, DI;取第一个数MOV ADDR, DI ;登记确定值最大的数的地址CMP AX, 0 ;此数是正数吗?JNS ZHEN ;是正数,即为确定值,转去推断下一个数NEG AX ;不是正数,变为其确定值ZHEN: MOV BX, DICMP BX, 0 ;此数是正数吗?JNS COMP ;是正数,即为确定值,转去比较确定值大小NEG BX ;不是正数,变为其确定值COMP: CMP AX, BX ;推

21、断确定值大小JAE ADDRESSMOV AX, BX ; (AX) (BX),使(AX)中为确定值最大的数MOV ADDR, DI ;登记确定值最大的数的地址LOOP ZHENMOV DATA, AX ;登记此数RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 16在首地址为DATA的字数组中存放着100H个16位补码数,试编写一 个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小 于此平均值,将结果放在BX寄存器中。答:程序如下:DSEG SEGMENTDATA DW 100H DUP (?)CSEG SEGMENTMAIN PROC FAR

22、ASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV CX, 1OOH ;循环计数器MOV SI, 0MOV BX, 0 ;和(DI), (BX)的初始值MOV DI, 0CWDADD BX, AX ;求和ADC DI, DX ;加上进位位ADD SI, 2LOOP NEXTMOV DX, DI ;将(口1), (BX)中的累加和放入(DX), (AX)中MOV AX, BXMOV CX, 100HIDIV CX ;带符号数求平均值,

23、放入(AX)中MOV BX, 0MOV SI, 0COMP: CMP AX, DATA SI;找寻小于平均值的数JLE NOINC BX ;小于平均值数的个数+1LOOP COMPRETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 17试编制一个程序把AX中的16进制数转换为ASCH码,并将对应的 ASCH码依次存放到MEM数组中的四个字节中。例如,当(AX) =2A49H时, 程序执行完后,MEM中的4个字节内容为39H, 34H, 41H, 32H。答:程序如下:DSEG SEGMENTMEM DB 4 DUP (?)N DW 2A49HCSEG SEGME

24、NTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV CH, 4 ;循环计数器MOV CL, 4MOV AX, NLEA BX, MEMROTATE: MOV DL, AL ;从最低四位起先转换为ASCH码AND DL, OFHADD DL, 30HCMP DL, 3AH ;是 09 吗?JL NEXTADD DL, 07H ;是 AFNEXT: MOV BX, DL ;转换的 ASCII 码送入 MEM

25、 中INC BXROR AX, CL ;准备转换下一位DEC CHJNZ ROTATERETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 18把OIOOD之间的30个数存入以GRADE为首地址的30字数组中, GRADE+i表示学号为i+1的学生的成果。另一个数组RANK为30个学生的 名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序, 依据GRADE中的学生成果,将学生名次填入RANK数组中。(提示:一个学 生的名次等于成果高于这个学生的人数加1。)答:程序如下:DSEG SEGMENTGRADE DW 30 DUP (?);假设已预先存好

26、30名学生的成果RANK DW 30 DUP (?)DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGDEC CHJNZ A10 ;循环四次完了码?BIO: MOV DL, STORE ;四组数分别放在AL、BL、CL和DL中MOV CL, STORE+1MOV BL, STORE+2MOV AL, STORE+3STOP: RET5. 4试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是 否完全相同,若相同则显示MATCH,若不相同则显示NO MATCH。答:程序如下:DSEG SEGMENTSTRIN

27、G1 DB 1 ama student.STRING2 DB I ama student!YES DB MATCH,ODH, OAH, $NO DB NO MATCH,ODH, OAH,DSEG ENDSSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV DI, 0MOV CX, 30 ;外循环计数器L00P1: PUSH CXMOV CX, 30 ;内循环计数器MOV SI, 0MOV AX, GRADE DIMOV DX, 1 ;起始名次为第1名L00P2: CMP GRADE

28、 SI, AX ;成果比较JBE GO_ONINC DX ;名次+1GO_ON: ADD SI, 2LOOP L00P2POP CXMOV RNAK DI, DX ;名次存入 RANK 数组ADD DI, 2LOOP LOOP1RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5. 19已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一程序把既在A中又在B中出现的整数存放于数组C中。答:程序如下:DSEG SEGMENTA DW15DUP(?)B DW20DUP(?)C DW15DUP()DSEG ENDSCSEG SEGMENTMAIN

29、PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV SI, 0MOV BX, 0MOV CX, 15 ;外循环计数器LOOP1: PUSH CXMOV CX, 20 ;内循环计数器MOV DI, 0MOV AX, A SI;取A数组中的一个数L00P2: CMP B DI, AX ;和B数组中的数相等吗?JNE NOMOV C BX, AX ;相等存入C数组中ADD BX, 2NO: ADD DI, 2LOOP L0

30、0P2ADD SI, 2POP CXLOOP LOOP1RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5.20 设在A、B和C单元中分别存放着三个数。若三个数都不是0,则求 出三数之和存放在D单元中;若其中有一个数为0,则把其它两单元也清 0o请编写此程序。答:程序如下:DSEG SEGMENTA DW ?B DW ?C DW ?D DW 0DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEG

31、MOV DS, AX ;给 DS 赋值BEGIN: CMP A, 0JE NEXTCMP B, 0JE NEXTCMP C, 0JE NEXTMOV AX, AADD AX, BADD AX, CMOV D, AXJMP SHORT EXITNEXT: MOV A, 0MOV B, 0MOV C, 0EXIT: RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5.21 试编写一程序,要求比较数组ARRAY中的三个16位补码数,并依据比较结果在终端上显示如下信息:(I)假如三个数都不相等则显示0;(2)假如三个数有二个数相等则显示1;(3)假如三个数都相等则显示2。

32、答:程序如下:DSEG SEGMENTARRAY DW 3 DUP (?)DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: LEA SI, ARRAYMOV DX, 0 ; (DX)用于存放所求的结果MOV AX, SIMOV BX, SI+2CMP AX, BX ;比较第一和其次两个数是否相等JNE NEXT1INC DXNEXTl: CMP SI+4, AX ;比较第

33、一和第三两个数是否相等JNE NEXT2INC DXNEXT2: CMP SI+4, BX ;比较其次和第三两个数是否相等JNE NUMINC DXNUM: CMP DX, 3JL DISPDEC DXDISP: ADD DL, 30H ;转换为 ASCH 码MOV AH, 2 ;显示一个字符INT 21HRETMAIN ENDPCSEG ENDS ;以上定义代码段END STARTCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEG, ES: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX

34、, DSEGMOV DS, AX ;给 DS 赋值MOV ES, AX ;给 ES 赋值 9BEGIN: LEA SI, STRING1 ;设置串比较指令的初值LEA DI, STRING2CLD5. 22从键盘输入一系列字符(以回车符结束),并按字母、数字、与其它 字符分类计数,最终显示出这三类的计数结果。答:程序如下:DSEG SEGMENTALPHABET DB 输入的字母字符个数为:,$NUMBER DB 输入的数字字符个数为:,$OTHER DB 输入的其它字符个数为:,$CRLF DB ODH, 0AH,DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUM

35、E CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV BX, 0 ;字母字符计数器MOV SI, 0 ;数字字符计数器MOV DI, 0 ;其它字符计数器INPUT: MOV AH, 1 ;输入一个字符INT 21HCMP AL, ODH ;是回车符吗?JE DISPCMP AL, 30H ;数字 0 吗?JAE NEXT1OTHER: INC DI ;是其它字符JMP SHORT INPUTNEXT1: CMP AL, 39H ; 数字 9

36、吗?JA NEXT2INC SI ;是数字字符JMP SHORT INPUTNEXT2: CMP AL, 41H ;字母 A 吗?JAE NEXT3JMP SHORT OTHER ;是其它字符NEXT3: CMP AL, 5AH ; 字母 Z 吗?JA NEXT4INC BX ;是字母字符AZJMP SHORT INPUTNEXT4: CMP AL, 61H ;字母 a 吗?JAE NEXT5JMP SHORT OTHER ;是其它字符NEXT5: CMP AL, 7AH ; 字母 z 吗?JA SHORT OTHER ;是其它字符INC BX ;是字母字符azJMP SHORT INPUTD

37、ISP: LEA DX, ALPHABETCALL DISPLAYLEA DX, NUMBERMOV BX, SICALL DISPLAYLEA DX, OTHERMOV BX, DICALL DISPLAYRETDISPLAY PROC NEARMOV AH, 09H ;显示字符串功能调用INT 21HCALL BINIHEX ;调把BX中二进制数转换为16进制显示子程序LEA DX, CRLFMOV AH, 09H ;显示回车换行INT 21HRETDISPLAY ENDPBINIHEX PROC NEAR ;将BX中二进制数转换为16进制数显示子程序MOV CH, 4ROTATE: MO

38、V CL, 4ROL BX, CLMOV DL, BLAND DL, OFHADD DL, 30HCMP DL, 3AH ;是 AF 吗?JL PRINT_ITADD DL, 07HPRINT_IT: MOV AH, 02H ;显示一个字符INT 21HDEC CHJNZ ROTATERETBINIHEX ENDPCSEG ENDS ;以上定义代码段END START5.23已定义了两个整数变量A和B,试编写程序完成下列功能:(1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中;(2)若两个数中均为奇数,则将两数加1后存回原变量;(3)若两个数中均为偶数,则两个变量均不变更。答:程序如

39、下:DSEG SEGMENTA DW ?B DW ?DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV AX, AMOV BX, BXOR AX, BXTEST AX, OOO1II ; A和B同为奇数或偶数吗?JZ CLASS ; A和B都为奇数或偶数,转走TEST BX, 0001HJZ EXIT ; B为偶数,转走XCHG BX, A ; A为偶数,将奇数存入

40、A中MOV B, BX ;将偶数存入B中CLASS: TEST BX, 0001H ; A 和 B 都为奇数吗?JZ EXIT ; A和B同为偶数,转走INC BINC AEXIT: RETMAIN ENDPCSEG ENDS ;以上定义代码段END START5.24假设已编制好5个歌曲程序,它们的段地址和偏移地址存放在数据 段的跳动表SINGLIST中。试编制一程序,依据从键盘输入的歌曲编号5, 转去执行五个歌曲程序中的某一个。答:程序如下:DSEG SEGMENTSINGLIST DD SING1DD SING2DD SING3DD SING4DD SING5ERRMSG DB Erro

41、r! Invalid parameter!, ODH, OAH,DSEG ENDSCSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV CX, STRING2 - STRING1REPE CMPSB ;串比较JNE DISPNOLEA DX, YES ;显示 MATCHJMP DISPLAYDISPNO: LEA DX, NO ;显示 NO MATCHDISPLAY: MOV AH, 9 ;显示一个字符串的DOS调用INT 21HRETMAIN ENDPCSE

42、G ENDS ;以上定义代码段END STARTMOV DS, AX ;给 DS 赋值BEGIN: MOV AH, 1 ;从键盘输入的歌曲编号15INT 21HCMP AL, ODHJZ EXIT ;是回车符,则结束SUB AL, T ;是 15 吗?JB ERROR ;小于1,错误CMP AL, 4JA ERROR ;大于5,错误MOV BX, OFFSET SINGLISTMUL AX, 4 ; (AX) = (AL)*4,每个歌曲程序的首地址占4个字节ADD BX, AXJMP DWORD PTRBX;转去执行歌曲程序ERROR: MOV DX, OFFSET ERRMSGINT 21H

43、 ;显示错误信息JMP BEGINSING1::JMP BEGINSING2:;JMP BEGINSING3::JMP BEGINSING4::JMP BEGINSING5::JMP BEGINEXIT: RETMAIN ENDPEND START5. 25试用8086的乘法指令编制一个32位数和16位数相乘的程序;再用 80386的乘法指令编制一个32位数和16位数相乘的程序,并定性比较两 个程序的效率。答:8086的程序如下(假设为无符号数):DSEG SEGMENTMUL1 DD ? ; 32位被乘数MUL2 DW ? ; 16 位乘数MULO DW 0, 0 , 0 , 0 ;乘积用6

44、4位单元存放DSEG ENDSMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值BEGIN: MOV BX, MUL2 ;取乘数MOV AX, WORD PTR MUL1 ;取被乘数低位字MUL BXMOV MULO, AX ;保存部分积低位MOV MULO+2, DX ;保存部分积高位MOV AX, WORD PTRMULl+2;取被乘数高位字MUL BXADD MULO+2, AX ;部分积低位和原部分积高位相加ADC MULO+4, DX ;保存部

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁