第四章习题解答(共10页).doc

上传人:飞****2 文档编号:8910725 上传时间:2022-03-26 格式:DOC 页数:10 大小:42.50KB
返回 下载 相关 举报
第四章习题解答(共10页).doc_第1页
第1页 / 共10页
第四章习题解答(共10页).doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《第四章习题解答(共10页).doc》由会员分享,可在线阅读,更多相关《第四章习题解答(共10页).doc(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上习题4.3将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。 解答假设ax=11101思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段: mov bl, al ;将al中的两组分开 and al, 0fh ;屏蔽高四位后送al:1101 mov cl, 4 ;原al中的数据逻辑右移4次送bl shr bl, cl ;bl内容:1111 mov dl, ah ;将ah中的两组分开 and dl, 0f0h ;屏蔽低高四位后送dl mov cl, 4 ;原ah中的数据逻辑右移4次送dl s

2、hr dl, cl ;dl:1011 mov cl, ah ;屏蔽高四位后送cl:0100 and cl, 0fh习题4.4编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。 解答getkey: mov ah, 1 ;从键盘输入,出口:al存键值 int 21h cmp al, a ;判键值是小写字母? jb getkay cmp al, z ja getkay sub al,20h ;是小写字母转换为大写字母 mov dl,al mov ah, 02h ;显示 int 21h习题4.5已知用于LED数码管显示的代码表为: LEDtable DB 0c0h,0f9h,0a4h,0b0

3、h,99h,92h,82h,0f8h DB 80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示0 9、A F这16个数码的显示代码。现编写一个程序实现将lednum中的一个数字(0 9、A F)转换成对应的LED显示代码。解答 .model small .stack 256 .dataLEDtable DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h DB 80h,90h,88h,83h,0c6h,0clh、86h,8ehlednum DB ? .code .startup mov bx, offset LEDtable mov al,

4、lednum xlat ;al中存有对应的LED显示代码 .exit 0 end习题4.10设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存-1(ffh)。编写该程序。 解答 .model small .stack .databufX dw -7signX db ? .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp donenext: mov signX,-1done: .exit 0 end习题4.11bufX、bufY和buf

5、Z是3个有符号16进制数,编写一个比较相等关系的程序: (1)如果这3个数都不相等,则显示0;(2)如果这3个数中有两个数相等,则显示1;(3)如果这3个数都相等,则显示2。解答 .model small .stack 256 .databufx dw ?bufY dw ? bufz dw ? .code .startup mov ax, bufX ;cmp x,y?可以吗? mov bx, bufY mov cx, bufZ mov dl, 0 cmp ax,bx jnz next1 inc dlnext1: cmp ax,cx jnz next2 inc dlnext2: cmp bx,c

6、x jnz next3 inc dlnext3: cmp dl,3 jb next4 mov dl,2next4: mov ah,02h ;显示 int 21h .exit 0 end习题4.16编程实现把键入的一个字符,用二进制形式(0 / 1)显示出它的ASCII代码值。 解答.model small .stack 256 .data stri1 db please input,0dh,0ah,$ .code .startup mov dx,offset stri1 mov ah,09h int 21h mov ah, 01h int 21h mov cx, 8 again: xor dl

7、,dl shl al, 1adc dl, 0 :dl=dl+0+cf:如果cf=0,那么dl=30h; 如果cf=1,那么dl=0+30h+1=31h mov ah,02h int 21h loop again .exit 0 end习题4.17编写程序,要求从键盘接收一个数bellN(0 9),然后响铃bellN次。 解答.model small .stack .data stri1 db please input number:1-9,0dh,0ah,$ .code .startup again: mov dx,offset stri1 ;显示stri1,提示输入 mov ah,09h i

8、nt 21h mov ah,01h ;调用输入一个字符 int 21h ;输入一个字符存在al中 cmp al, 1 ;判该字符,如不在1-9 jb again ;重新输入 cmp al, 9 ja again and al,0fh ;将31h 和39h 转换为1和9在1-9,屏蔽高4位 mov cl, al ;振铃次数送cx xor ch,ch abc:mov dl, 07h ;调用一次振铃 mov ah, 02h int 21h loop abc .exit 0 end习题4.19编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过

9、则显示overflow。 解答 .model small .stack .datanum equ 100wlist dw num dup(?)wordsum dw ?error db overflow. $ .code .startup mov bx,offset wlist mov cx,num xor ax,axagain: add ax,bx jc next inc bx inc bx loop again mov bx,ax jmp donenext: mov dx,offset error mov ah,9 int 21hdone: .exit 0 end习题4.22过程定义的一般格

10、式是怎样的?子程序入口为什么常有PUSH指令、出口为什么有POP指令?下面的程序段有什么不妥吗?若有,请改正: crazy PROC push ax xor ax,ax xor dx,dxagain: add ax,bx adc dx,0 inc bx inc bx loop again ret ENDP crazy解答crazy PROC ;crazy PROC push ax ; push bx xor ax,ax ; xor ax,ax xor dx,dx ; xor dx,dxagain: add ax,bx ;again: add ax,bx adc dx,0 ; adc dx,0

11、inc bx ; inc bx inc bx ; inc bx loop again ; loop again ret ; ret pop bx pop ax ENDP crazy ; crazy ENDP习题4.23子程序的参数传递有哪些方法,请简单比较。 解答寄存器、共享变量(公共存储单元)、堆栈用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用;用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量

12、,调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差,然而,在多个程序段间,尤其在不同程序的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口压入堆栈,主程序弹出堆栈取得它们。习题4.27请按如下子程序说明编写过程: ;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数 ;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 ;出口参数:AL=对应的二进制数解答astob proc and

13、 dh, 0fh ;十位数的ASCII码转为二进制数 mov al, dh mul 10 ;al= 10*dh and dl, 0fh ;个位数的ASCII码转为二进制数 add al, dl ;al= 10*dh + dl retastob endp习题4.28写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。 解答Change proc Push bx ;保护bx xor bx, bx ;位移量清零 cmp al,0 ;根据入口参数AL=0/1/2,分别处理 jz chan_0 dec a

14、l jz chan_1 dec al jz chan_2 jmp donechan_0: mov al,stringbx ;实现对大写字母转换成小写 cmp al,0 jz done cmp al,A ;是大写字母 jb next0 cmp al,Z ;是大写字母 ja next0 add al, 20h ;转换 mov stringbx, alnext0: inc bx ;位移量加1,指向下一字母 jmp chan_0chan_1: mov al,stringbx ;实现对小写字母转换成大写 cmp al,0 jz done cmp al,a ;是大写字母 jb next1 cmp al,z

15、 ;是大写字母 ja next1 sub al, 20h ;转换 mov stringbx, alnext0: inc bx ;位移量加1,指向下一字母 jmp chan_1chan_2: mov al,stringbx ;实现对大写字母转换成小写 cmp al,0 jz done cmp al,A ;是大写字母 jb next2 cmp al,Z ;是大写字母 ja next20 add al, 20h ;转换 jmp next2next20: cmp al,a ;是大写字母 jb next2 cmp al,z ;是大写字母 ja next2 sub al, 20h ;转换 mov stri

16、ngbx, alnext2: inc bx ;位移量加1,指向下一字母 jmp chan_2done: pop bx ;恢复bx retchange endp习题4.29编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。 (1)采用AX寄存器传递这个16位二进制数(2)采用wordTEMP变量传递这个16位二进制数(3)采用堆栈方法传递这个16位二进制数解答(1)采用AX寄存器传递这个16位二进制数 .model small .stack .datawdata dw 34abh .code .startup mov ax,wd

17、ata call dispa .exit 0 ;dispa proc push cx push dx mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2 in

18、t 21h pop ax retdldisp endp end(2)采用wordTEMP变量传递这个16位二进制数 .model small .stack .datawdata dw 34abhwordtemp dw ? .code .startup mov ax,wdata mov wordtemp,ax call dispa .exit 0 ;dispa proc push cx push dx mov cl,4 mov dl,byte ptr wordtemp+1 shr dl,cl call dldisp mov dl,byte ptr wordtemp+1 and dl,0fh ca

19、ll dldisp mov dl,byte ptr wordtemp shr dl,cl call dldisp mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2 int 21h pop ax retdldisp endp end(3)采用堆栈方法传递这个16位二进制数 .model small .stack .datawdata dw

20、 34abh .code .startup push wdata call dispa pop ax ;add sp,2 .exit 0 ;dispa proc push bp mov bp,sp push ax push cx push dx mov ax,bp+4 mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2 int 21h pop ax retdldisp endp end专心-专注-专业

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

当前位置:首页 > 应用文书 > 教育教学

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com