


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计 第四版【课后习题答案】-囮裑為檤第 4 章 根本汇编语言程序设计习题 4.1例题 4.2 如果要求算术右移 8 位,如何修改程序。解答思路:首先由最高位字节向次低位字节传送次低位字节向最低位字节传送共 7次;再判最高位字节符号位,如为 0,送 00h 到最高位字节;如为 1,送 ffh 到最高位字节。传 送可参考例题 4.2,不过应从第一号字节送第零号字节, 最高位字节向次低位字节传送; 也可以用循环来完成:.model small.stack 256.data.code.startupmov cx,7mov si,1again: mov al, byte ptr qvars
2、imov byte ptr qvarsi-1,alinc siloop againtest al,80hjz ezzmov bl,0ffhjmp doneezz: mov bl,0done: mov byte ptr qvar7,bl.exit 0end习题 4.2例题 4.2 如果要求算术左移 7 位,如何用移位指令实现。解答思路:可设计外循环体为 8 个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带 CF 位循环左移一次内循环共 8 次,外循环体控制执行 7 次即可。.model small.stack 256.data.code.startup;外循环次数;最
3、低位字节送 ax;最低位字节左移一次,其 d7 移入 CF 位;内循环次数;高位字节依次左移 P50mov dx, 7mov ax, byte ptr qvar0lpp:shl ax, 1mov si, 1mov cx, 7again: rcl byte ptr qvarsi, 1 inc si loop again dec dx jnz lpp .exit 0.end习题 4.3将 AX 存放器中的 16 位数连续 4 位分成一组,共 4 组,然后把这 4 组数分别 放在 AL 、BL 、CL 和 DL 存放器中。解答 思路:设这四组从低位到高位分别放在AL 、BL 、CL 和 DL 存放器
4、中。仅列出代码段:mov bl, al;将 al 中的两组分开and al, 0fh;屏蔽高四位后送 almov cl, 4;原 al 中的数据逻辑右移4 次送 blshr bl, clmov dl, ah;将 ah 中的两组分开and dl, 0f0h;屏蔽低高四位后送 dlmov cl, 4;原 ah 中的数据逻辑右移4 次送 dlshr dl, clmov cl, ah;屏蔽高四位后送 cland cl, 0fh习题 4.4编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。 解答getkey:mov ah, 1int 21h cmp al, 'a' jb get
5、kay cmp al, 'z' ja getkay sub al,20h mov dl,al mov ah, 02h int 21h;从键盘输入,出口 :al 存键值;判键值是小写字母?;是小写字母转换为大写字母;显示习题 4.5用于LED 数码管显示的代码表为:LEDtable DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB 80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示 0 9、A F 这 16 个数码的显示代码。现编写一个程序实现将 个数字 0 9、A F 转换成对应的 LED 显示代码。解答.model
6、small.stack 256.dataLEDtable DB 0c0h , 0f9h , 0a4h,0b0h,99h,92h ,82h,0f8hDB 80h ,90h,88h,83h,0c6h,0clh、 86h,8eh lednum DB ?.code.startupmov bx, offset LEDtablemov al, lednumxlat; al 中存有对应的 LED 显示代码.exit 0endlednum 中的一习题 4.6编制一个程序,把变量 bufX 和 bufY 中较大者存入 bufZ ; 把其中之一存入 bufZ 中。假设变量存放的是 8 位无符号数。解答假设两者相等
7、,那么.model small.stack 256 .data bufxdb ?bufYdb ?bufzdb ?.code .startup mov al, bufX mov bl, bufY cmp al,bl ja next mov bufZ, bl jmp donenext: mov bufZ, aldone: .exit 0end习题 4.7设变量 bufX 为有符号 16 位数,请将它的符号状态保存在 大于等于 0,保存 0;如果 X 小于 0,保存 -1ffh 。编写该程序。 解答signX ,即:如果 X.model small.stack.data bufXdw -7signX
8、db ?.code.startupcmp bufX,0;test bufX,80hjl next;jnz nextmov signX,0 jmp done next: mov signX,-1 done: .exit 0end习题 4.8bufX 、bufY 和 bufZ 是 3个有符号 16 进制数,编写一个比拟相等关系的程序: 1如果这 3 个数都不相等,那么显示 0;2如果这 3 个数中有两个数相等,那么显示 1; 3如果这 3 个数都相等,那么显示 2。解答.model small.stack 256.data bufxdw ?bufYdw ?bufzdw ?.code.startup
9、mov ax, bufXmov bx, bufYmov cx, bufZmov dl, '0'cmp ax,bxjnz next1inc dl next1: cmp ax,cxjnz next2inc dl next2: cmp bx,cxjnz next3inc dlnext3: cmp dl, ' 3'jb next4mov dl, ' 2' next4: mov ah,02h ;显示int 21h.exit 0end习题 4.9例题 4.8 内外循环次数共是多少?如果要求按从大到小排序,程序如何修改? 解答外循环次数是: count-1 次
10、 19 次 内循环次数是: count-1! 次 19! 次 内外循环次数共是 count-1 + count-1 !次 ,即 19+19!次 0串操作指令常要利用循环结构,现在不用串操作指令实现字符串string1 内容传送到字符串 string2 ,字符长度为 count 。解答.model small.stack 256.datastring1 db 'good morning!'len = $-string1string2 db len dup(?) .code.startup mov cx, len mov si, offset string1 mov di, off
11、set string2 again: mov al, simov di, alinc si;inc di loop again.exit 0 end;字符数;源指针;目标指针;送一个字符修改指针;修改指针; cx=cx-1,cx=0 时退出循环1不用串操作指令求主存解答0040h : 0 开始的一个 64KB 物理段中共有多少个空格?这里仅列出主程序段:mov ax,0040h ;送段地址mov ds, axxor si, si;偏移量地址xor cx, cx;计数循环次数xor dx, dx;空格计数器清零again:cmp si, 20h ;与空格的 ASCII 码比拟jne next i
12、nc dx next: inc si loop again.exit 0;不是空格,转;是空格,空格数加 1;修改地址指针; cx=cx-1, 如 cx=0 退出循环end2编程实现把键入的一个字符,用二进制形式0 / 1显示出它的 ASCII 代码值。解答.model small.stack 256.datastri1 db 'please input',0dh,0ah,'$'.code.startupmov dx,offset stri1mov ah,09hint 21hmov ah, 01hint 21hmov cx, 8again: xor dl,dls
13、hl al, 1adc dl, '0'mov ah,02hint 21hloop again.exit 0end3编写程序,要求从键盘接收一个数bellN 0 9,然后响铃 bellN 次。解答.model small.stack.datastri1 db 'please input number:1-9',0dh,0ah,'$'.code.startupagain: mov dx,offset stri1 ;显示 stri1 ,提示输入mov ah,09hint 21hmov ah,01h ;调用输入一个字符int 21h;输入一个字符存在 a
14、l 中cmp al, '1';判该字符,如不在 1-' 9'jb again;重新输入cmp al, '9'ja againand al,0fh;在 1-' 9,'屏蔽高 4 位mov cl, al;振铃次数送 cxxor ch,chabc:mov dl, 07h;调用一次振铃mov ah, 02hint 21hloop abc.exit 0end4编写程序, 将一个包含有 20 个有符号数据的数组 arrayM 分成两个数组: 正数数组 arrayP 和负数数组 arrayN ,并分别把这两个数组中的数据个数显示出来。解答.mo
15、del smallarrayM arrayP arrayN dispP dispN.stack.datadb1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 ;源数组20 dup(?);正数数组20 dup(?);负数数组dbdbdb 'Plus Number: ','$'db 0dh,0ah,'Negs Number: ','$'.code.startup mov cx, 20 xor bx, bx xor si, si again:mov ax, arrayMsicmp ax,0
16、 jl Neg inc bh jmp next Neg:inc blnext:inc siloop again mov ah , 09h mov dx, offset dispP int 21h mov al,bh call dispuib mov ah , 09h mov dx, offset dispN int 21h mov al,bl call dispuib.exit 0;源数组元素数;设 bh 为正数个数, bl 为负数个数,均清零 源数组地址位移量循环 20 次;取一个元素;判正数是,正数个数加 1;否,负数个数加 1 修改位移量 循环次数减 1 ;调用显示字符串功能 ;显示个数
17、; 调用 I/O 子程序库中的子程序 ;调用显示字符串功能;显示个数; 调用 I/O 子程序库中的子程序end16 位字的范围 65535 ,那么保存其5编写计算 100 个正整数之和的程序。如果和不超过和到 wordsum ,如超过那么显示 overflow 。' 解答.model small.stack.data numequ 100wlist dw num dup(?) wordsum dw ? errordb 'overflow. $'.code.startup mov bx,offset wlist mov cx,num xor ax,ax again: ad
18、d ax,bxjc nextinc bx inc bx loop again mov bx,ax jmp done next: mov dx,offset errormov ah,9 int 21h done: .exit 0end习题4.16编程判断主存 0070h: 0开始的1KB中有无字符串 DEBU'。这是一个字符 串包含的问题,可以采用逐个向后比拟的简单算法。解答.model small.stack.datadisp1 db 'There is DEBUG in the aera!' ,0dh,0ah, $'disp2 db 'There is
19、 no DEBUG in the aera!' ,0dh,0ah, $'.code .startup mov ax, 0070h ;送段地址 mov ds, ax xor si, si ;地址指针清零 mov cx,1024cmp si, 'D' ;与 D比拟jne next;不是,转inc si;是,地址增 1cmp si, 'E';同上jne nextinc sicmp si, 'B'jne nextinc sicmp si, 'U'jne nextinc sicmp si, 'G'je yes
20、;是 DEBUG转next:inc si;不是,地址增 1loop again;循环no:mov dx, offset disp2;没找到,显示 disp2jmp dspyes:mov dx, offset disp1;找到,显示 disp1dsp:mov ah, 09hint 21h.exit 0end习题 4.17编程把一个 16 位无符号二进制数转换成为用 8421BCD 码表示的 5 位十进制 数。转换算法可以是:用二进制数除以10000,商为 “万位,再用余数除以 1000,得到 “千位;依次用余数除以 100、10 和 1,得到 “百位、“十位 和“个位。解答.model smal
21、l.stack 256.datavar dw 3546dbcd db 5 dup(?).code.startupmov ax, varmov bx, 10000mov cl, 10xor si, sixor dx, dxagain: div bxmov dbcdsi, alinc sixchg ax, bxdiv clxchg ax, bxcmp si,5jnz again.exit 0end习题 4.18没有。习题 4.19 -习题 4.20 -习题 4.21 -PUSH 指令、出口为习题 4.22过程定义的一般格式是怎样的?子程序入口为什么常有什么有 POP 指令?下面的程序段有什么不妥吗
22、?假设有,请改正:crazy PROC push ax xor ax,ax xor dx,dx again: add ax,bx adc dx,0 inc bx inc bx loop again ret ENDP crazy解答; crazy PROC; xor ax,ax; xor dx,dx; again: add ax,bx; adc dx,0inc bxinc bx; loop againret; crazy ENDPcrazy PROC push ax xor ax,ax xor dx,dx again: add ax,bx adc dx,0 inc bx inc bx loop
23、again ret ENDP crazy习题 4.23子程序的参数传递有哪些方法,请简单比拟。解答 存放器、共享变量公共存储单元 、堆栈 用存放器传递参数是把参数存于约定的存放器中,这种方法简单易行,经常采用; 用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变 量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段存放 器 DS ,那么子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量,调用程序 与被调用程序不在同一个源文件中,必须利用 public/extern 进行声明,才能用变量传递参 数,利用变量传递参数,过程的通用性比拟差,
24、然而,在多个程序段间,尤其在不同程序 的模块间,利用全局变量共享数据也是一种常见的参数传递方法; 用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程 序将出口压入堆栈,主程序弹出堆栈取得它们。习题 4.24采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。 解答 采用堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取 出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。因为堆栈采用 “先进后出 原那么存取,而且返回地址和保护的存放器等也要存于堆栈,所以要特别注意堆栈平衡问题。习题 4.25什么是子程序的嵌套、递归和重入?解
25、答 子程序中又调用子程序就形成子程序嵌套。 子程序中直接或间接调用该子程序本身就形成子程序递归。 子程序的重入是指子程序被中断后又被中断效劳程序所调用,能够重入的子程序称为可重 入子程序。习题 4.26将例题 4.7 的大写转换为小写字母写成过程,利用 AL 作为入口、出口参数完 成。解答.model small.stack 256.datastdng db 'HeLLO eveRyboDy ! ' , 0.code.startupmov bx, offset atringagain: mov al, bxcall chan ;调用过程mov bx , alnext: inc
26、bxjmp againdone: .exit 0chan proc ;大写转换为小写字母的过程or al, aljz donecmp al,'A'jb nextcmp al, 'Z'ja nextor al, 20hretchan endpend习题 4.27请按如下子程序说明编写过程:;子程序功能:把用 ASCII 码表示的两位十进制数转换为对应二进制数 ;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 ;出口参数: AL= 对应的二进制数解答astob procand dh, 0fh ;十位数的 ASCII 码转为二进制数mov al, d
27、hmul 10 ; al= 10*dhand dl, 0fh ;个位数的 ASCII 码转为二进制数add al, dl ;al= 10*dh + dlretastob endp习题 4.28写一个子程序,根据入口参数 AL=0/1/2 ,分别实现对大写字母转换成小写、string 中,用 0 表示结束。小写转换成大写或大小写字母互换。欲转换的字符串在 解答Change proc;保护 bx;位移量清零;根据入口参数 AL=0/1/2 ,分别处理;实现对大写字母转换成小写1,指向下一字母;实现对小写字母转换成大写Push bx xor bx, bx cmp al,0 jz chan_0 dec
28、 al jz chan_1 dec al jz chan_2 jmp done chan_0: mov al,stringbx cmp al,0 jz done cmp al, ' A' ;是大写字母 jb next0cmp al, ' Z' ;是大写字母 ja next0add al, 20h ;转换mov stringbx, al next0:inc bx;位移量加jmp chan_0chan_1: mov al,stringbxcmp al,0jz donecmp al, ' a' ;是大写字母 jb next1cmp al, '
29、z' ;是大写字母ja next1sub al, 20h ;转换mov stringbx, alnext0: inc bx ;位移量加 1,指向下一字母 jmp chan_1chan_2: mov al,stringbx ;实现对大写字母转换成小写cmp al,0jz donecmp al, ' A' ;是大写字母jb next2cmp al, ' Z' ;是大写字母 ja next20add al, 20h ;转换jmp next2next20: cmp al, ' a' ;是大写字母jb next2cmp al, ' z
30、9; ;是大写字母ja next2sub al, 20h ;转换 mov stringbx, alnext2:inc bx;位移量加 1,指向下一字母jmp chan_2done: pop bx;恢复 bxretchange endp习题 4.29编制一个子程序把一个 16 位二进制数用十六进制形式在屏幕上显示出来,分 别运用如下 3 种参数传递方法,并用一个主程序验证它。 1采用 AX 存放器传递这个 16 位二进制数 2采用 wordTEMP 变量传递这个 16 位二进制数 3采用堆栈方法传递这个 16 位二进制数解答 1采用 AX 存放器传递这个 16 位二进制数.model small
31、.stack.datawdata dw 34abh.code.startupmov ax,wdatacall dispa.exit 0dispa 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 retdispaendpdldispJproc push ax or dl,30h cmp dl,39h
32、jbe dldisp1 add dl,7dldisp1: mov ah,2int 21hpop axretdldispendpend 2采用 wordTEMP 变量传递这个 16 位二进制数 .model small.stack.data wdatadw 34abhwordtemp dw ?.code .startup mov ax,wdata mov wordtemp,ax call dispa.exit 0dispa procpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1 shr dl,cl call dldispmov dl,byte p
33、tr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtemp shr dl,cl call dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispaendpdldispJproc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2int 21hpop axretdldispendpend 3采用堆栈方法传递这个 16 位二进制数 .model small.stack.dat
34、awdata dw 34abh.code.startuppush wdatacall dispa;add sp,2pop ax.exit 0dispa 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 retdispaendpdldispJproc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2int 21hpop axretdldispendpend习题 4.3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 塑料挤出模企业县域市场拓展与下沉战略研究报告
- 自动模内贴标机企业ESG实践与创新战略研究报告
- 发酵罐企业县域市场拓展与下沉战略研究报告
- 普通质量低合金钢(粗钢)企业县域市场拓展与下沉战略研究报告
- 呼吸器保护装置企业县域市场拓展与下沉战略研究报告
- 矿车翻车机企业ESG实践与创新战略研究报告
- 均匀度检测仪器企业数字化转型与智慧升级战略研究报告
- 上海市闵行区2023-2024学年八年级下学期期末物理试题【含答案解析】
- 黑龙江省哈尔滨市通河县2020-2021学年八年级下学期期末考试物理试题【含答案解析】
- 2025-2030中国智慧仓储行业发展分析及投资前景与战略规划研究报告
- 米、面制品安全生产与管理考核试卷
- 资金过桥合同协议
- 2025年江苏省连云港市东海县中考英语一模试卷
- 2024年山东青岛职业技术学院招聘笔试真题
- 2024年7月1日实施新版医疗器械采购、收货、验收、贮存、销售、出库、运输和售后服务工作程序
- JGJ107-2016钢筋机械连接技术规程
- 急性肾盂肾炎护理查房
- DB22T 5118-2022 建筑工程资料管理标准
- 小学二下必读书目《神笔马良》阅读测试题及答案
- 登临诗鉴赏(课堂PPT)
- 蒸压加气混凝土砌块薄层砌筑
评论
0/150
提交评论