2022年汇编语言程序设计第章【课后答案】.docx
精选学习资料 - - - - - - - - - 汇编语言程序设计 第四版【课后习题答案】-囮裑為檤第 4 章 基本汇编语言程序设计习题 4.1例题 4.2 假如要求算术右移 8 位,如何修改程序;解答思路:第一由最高位字节向次低位字节传送 次低位字节向最低位字节传送共 7 次;0,送 00h 到最高位字节;如为 1,送 ffh 到最高位字节;传 再判最高位字节符号位,如为 送可参考例题 4.2,不过应从第一号字节送第零号字节, 最高位字节向次低位字节传送;也可以用循环来完成:.model small .stack 256 .data .code .startup mov cx,7 mov si,1 again: mov al, byte ptr qvarsi mov byte ptr qvarsi-1,al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz: mov bl,0 done: mov byte ptr qvar7,bl .exit 0 end 习题 4.2例题 4.2 假如要求算术左移解答7 位,如何用移位指令实现;思路:可设计外循环体为 8 个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带 CF 位循环左移一次内循环共 8 次,外循环体掌握执行 7次即可;.model small .stack 256 .data - 1 - 名师归纳总结 - - - - - - -第 1 页,共 19 页精选学习资料 - - - - - - - - - .code .startup mov dx, 7 ;外循环次数 mov ax, byte ptr qvar0 ;最低位字节送 ax lpp: shl ax, 1 ;最低位字节左移一次,其 d7 移入 CF 位 mov si, 1 mov cx, 7 ;内循环次数P50 again: 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 寄存器中;仅列出代码段:mov bl, al ;将 al 中的两组分开 and al, 0fh ;屏蔽高四位后送 al mov cl, 4 ;原 al 中的数据规律右移 4 次送 bl shr bl, cl mov dl, ah ;将 ah 中的两组分开 and dl, 0f0h ;屏蔽低高四位后送 dl mov cl, 4 ;原 ah 中的数据规律右移 4 次送 dl shr dl, cl mov cl, ah ;屏蔽高四位后送 cl 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 数码管显示的代码表为:- 2 - 名师归纳总结 - - - - - - -第 2 页,共 19 页精选学习资料 - - - - - - - - - LEDtable DB 0c0h,0f9h,0a4h,0b0h,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 .data LEDtable DB 0c0h , 0f9h ,0a4h,0b0h,99h,92h ,82h,0f8h DB 80h ,90h,88h,83h,0c6h,0clh 、 86h,8eh lednum DB . .code .startup mov bx, offset LEDtable mov al, lednum xlat ;al 中存有对应的 LED 显示代码 .exit 0 end 习题 4.6编制一个程序,把变量 bufX 和 bufY 中较大者存入 bufZ ;假设两者相等,就 把其中之一存入 bufZ 中;假设变量存放的是 8 位无符号数;解答.model small .stack 256 .data bufx db . bufY db . bufz db . .code .startup mov al, bufX mov bl, bufY cmp al,bl ja next mov bufZ, bl jmp done next: mov bufZ, al done: .exit 0 end 习题 4.7设变量 bufX 为有符号 16 位数,请将它的符号状态储存在signX ,即:假如X大于等于 0,储存 0;假如 X 小于 0,储存 -1ffh ;编写该程序;解答.model small - 3 - 名师归纳总结 - - - - - - -第 3 页,共 19 页精选学习资料 - - - - - - - - - .stack .data bufX dw -7 signX db . .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next: mov signX,-1 done: .exit 0 end 习题 4.8bufX 、bufY 和 bufZ 是 3 个有符号1假如这3 个数都不相等,就显示0;16 进制数,编写一个比较相等关系的程序:2假如这3 个数中有两个数相等,就显示1;3假如这3 个数都相等,就显示2;解答.model small .stack 256 .data bufx dw . bufY dw . bufz dw . .code .startup mov ax, bufX mov bx, bufY mov cx, bufZ mov dl, '0' cmp ax,bx jnz next1 inc dl next1: cmp ax,cx jnz next2 inc dl next2: cmp bx,cx jnz next3 inc dl next3: cmp dl,3jb next4 mov dl,2next4: mov ah,02h ;显示- 4 - 名师归纳总结 - - - - - - -第 4 页,共 19 页精选学习资料 - - - - - - - - - int 21h .exit 0 end 习题 4.9例题 4.8 内外循环次数共是多少?假如要求按从大到小排序,程序如何修改?解答外循环次数是:count-1 次 19 次string1内容传送到字内循环次数是:count-1. 次 19. 次 内外循环次数共是count-1 + count-1 .次 ,即19+19!次0串操作指令常要利用循环结构,现在不用串操作指令实现字符串符串 string2 ,字符长度为count ;解答.model small .stack 256 .data string1 db 'good morning.' len = $-string1 string2 db len dup. .code .startup mov cx, len ;字符数mov si, offset string1 ;源指针mov di, offset string2 ;目标指针again: mov al, si ;送一个字符mov di, al inc si ;修改指针inc di ;修改指针loop again ;cx=cx-1,cx=0 时退出循环.exit 0 end 1不用串操作指令求主存0040h : 0 开头的一个64KB 物理段中共有多少个空格?解答这里仅列出主程序段:mov ax,0040h ;送段地址mov ds, ax xor si, si ;偏移量地址xor cx, cx ;计数循环次数xor dx, dx ;空格计数器清零again: cmp si, 20h ;与空格的 ASCII 码比较jne next ;不是空格,转inc dx ;是空格,空格数加 1 next: inc si ;修改地址指针loop again ;cx=cx-1, 如 cx=0 退出循环.exit 0 - 5 - 名师归纳总结 - - - - - - -第 5 页,共 19 页精选学习资料 - - - - - - - - - end 2编程实现把键入的一个字符,用二进制形式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,dl shl al, 1 adc dl, '0' mov ah,02h int 21h loop again .exit 0 end 3编写程序,要求从键盘接收一个数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 int 21h mov ah,01h ;调用输入一个字符int 21h ;输入一个字符存在al 中9cmp al, '1' ;判该字符,如不在1-jb again ;重新输入 cmp al, '9' ja again and al,0fh ;在 1-9,屏蔽高 4 位 mov cl, al ;振铃次数送 cx xor ch,ch abc: mov dl, 07h ;调用一次振铃- 6 - 名师归纳总结 - - - - - - -第 6 页,共 19 页精选学习资料 - - - - - - - - - mov ah, 02h int 21h loop abc .exit 0 end 分成两个数组: 正数数组 arrayP 4编写程序, 将一个包含有 20 个有符号数据的数组 arrayM 和负数数组 arrayN ,并分别把这两个数组中的数据个数显示出来;解答 .model small .stack .data arrayM db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 ;源数组 arrayP db 20 dup. ;正数数组 arrayN db 20 dup. ;负数数组 dispP db 'Plus Number: ','$' dispN db 0dh,0ah,'Negs Number: ','$' .code .startup mov cx, 20 ;源数组元素数 xor bx, bx ;设 bh 为正数个数, bl 为负数个数,均清零 xor si, si ;源数组地址位移量 again: ;循环 20 次 mov ax, arrayMsi ;取一个元素 cmp ax,0 ;判正数 jl Neg inc bh ;是,正数个数加 1 jmp next Neg: inc bl ;否,负数个数加 1 next: inc si ;修改位移量 loop again ;循环次数减 1 mov ah ,09h ;调用显示字符串功能 mov dx, offset dispP ;显示个数int 21h mov al,bh call dispuib ; 调用 I/O 子程序库中的子程序 mov ah ,09h ;调用显示字符串功能 mov dx, offset dispN ;显示个数 int 21h mov al,bl call dispuib ; 调用 I/O 子程序库中的子程序 .exit 0 end 5编写运算100 个正整数之和的程序;假如和不超过16 位字的范畴 65535,就储存其- 7 - 名师归纳总结 - - - - - - -第 7 页,共 19 页精选学习资料 - - - - - - - - - 和到 wordsum ,如超过就显示overflow ;解答.model small .stack .data num equ 100 wlist dw num dup. wordsum dw . error db 'overflow. $' .code .startup mov bx,offset wlist mov cx,num xor ax,ax again: add ax,bx jc next inc bx inc bx loop again mov bx,ax jmp done next: mov dx,offset error mov ah,9 int 21h done: .exit 0 end 习题 4.16编程判定主存0070h: 0 开头的 1KB 中有无字符串 DEBUG;这是一个字符串包含的问题,可以采纳逐个向后比较的简洁算法;解答.model small .stack .data disp1 db 'There is DEBUG in the aera.' ,0dh,0ah,$' $' disp2 db 'There is no DEBUG in the aera.' ,0dh,0ah,.code .startup mov ax, 0070h ;送段地址 mov ds, ax xor si, si ;地址指针清零 mov cx,1024 cmp si, 'D' ;与 D'比较jne next ;不是,转 inc si ;是,地址增 1 - 8 - 名师归纳总结 - - - - - - -第 8 页,共 19 页精选学习资料 - - - - - - - - - cmp si, 'E' ;同上 jne next inc si cmp si, 'B' jne next inc si cmp si, 'U' jne next inc si cmp si, 'G' je yes ;是 DEBUG',转 next: inc si ;不是,地址增 1 loop again ;循环no: mov dx, offset disp2 ;没找到,显示disp2 jmp dsp yes: mov dx, offset disp1 ;找到,显示disp1 dsp: mov ah, 09h int 21h .exit 0 end 习题 4.17编程把一个 16 位无符号二进制数转换成为用 8421BCD 码表示的 5 位十进制 数;转换算法可以是:用二进制数除以 10000,商为 “ 万位 ” ,再用余数除以 1000,得到 “ 千位” ;依次用余数除以 100、10 和 1,得到 “ 百位 ” 、“ 十位 ”和 “个位 ” ;解答.model small .stack 256 .data var dw 3546 dbcd db 5 dup. .code .startup mov ax, var mov bx, 10000 mov cl, 10 xor si, si xor dx, dx again: div bx mov dbcdsi, al inc si xchg ax, bx div cl xchg ax, bx cmp si,5 - 9 - 名师归纳总结 - - - - - - -第 9 页,共 19 页精选学习资料 - - - - - - - - - jnz again .exit 0 end 习题 4.18没有;习题 4.19- 习题 4.20- 习题 4.21- PUSH 指令、出口为习题 4.22过程定义的一般格式是怎样的?子程序入口为什么常有 什么有 POP 指令?下面的程序段有什么不妥吗?假设有,请改正: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 ;crazy PROC push ax ;xor ax,ax ;xor ax,ax xor dx,dx ;xor dx,dx again: add ax,bx ;again: add ax,bx adc dx,0 ;adc dx,0 inc bx ;inc bx inc bx ;inc bx loop again ;loop again ret ;ret ENDP crazy ; crazy ENDP 习题 4.23子程序的参数传递有哪些方法,请简洁比较;解答寄存器、共享变量公共储备单元、堆栈 用寄存器传递参数是把参数存于商定的寄存器中,这种方法简洁易行,常常采纳;用变量传递参数是主程序与被调用过程直接用同一个变量名拜访传递的参数,就是利用变量传递参数;假如调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存 器 DS,就子程序与主程序拜访变量的形式相同,也就是它们共享数据段的变量,调用程序与被调用程序不在同一个源文件中,必需利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差,然而,在多个程序段间,特殊在不同程序- 10 - 名师归纳总结 - - - - - - -第 10 页,共 19 页精选学习资料 - - - - - - - - - 的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程 序将出口压入堆栈,主程序弹出堆栈取得它们;习题 4.24采纳堆栈传递参数的一般方法是什么,为什么应当特殊留意堆栈平稳问题;解答采纳堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取 出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们;由于堆栈采纳“ 先进后出 ”原就存取,而且返回地址和爱护的寄存器等也要存于堆栈,所以要特殊留意堆栈平稳问题;习题 4.25什么是子程序的嵌套、递归和重入?解答子程序中又调用子程序就形成子程序嵌套;子程序中直接或间接调用该子程序本身就形成子程序递归;子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重 入子程序;习题 4.26将例题 4.7 的大写转换为小写字母写成过程,利用 成;解答.model small .stack 256 .data stdng db 'HeLLO eveRyboDy . ' , 0 .code .startup mov bx, offset atring again: mov al, bx call chan ;调用过程 mov bx , al next: inc bx jmp again done: .exit 0 chan proc ;大写转换为小写字母的过程 or al, al jz done cmp al,'A' jb next cmp al, 'Z' ja next or al, 20h ret chan endp end - 11 - AL 作为入口、出口参数完名师归纳总结 - - - - - - -第 11 页,共 19 页精选学习资料 - - - - - - - - - 习题 4.27请按如下子程序说明编写过程:;子程序功能:把用ASCII 码表示的两位十进制数转换为对应二进制数;入口参数: DH= 十位数的 ASCII码, DL= 个位数的ASCII 码;出口参数: AL= 对应的二进制数解答astob proc and dh, 0fh ;十位数的 ASCII 码转为二进制数 mov al, dh mul 10 ;al= 10*dh ASCII码转为二进制数and dl, 0fh ;个位数的add al, dl ;al= 10*dh + dl ret astob endp 习题 4.28写一个子程序,依据入口参数AL=0/1/2 ,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换;欲转换的字符串在 string 中,用 0 表示终止;解答Change proc Push bx ;爱护 bx AL=0/1/2 ,分别处理xor bx, bx ;位移量清零cmp al,0 ;依据入口参数jz chan_0 dec 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 next0 cmp al,Z;是大写字母ja next0 add al, 20h ;转换 mov stringbx, al next0: inc bx ;位移量加 1,指向下一字母 jmp chan_0 chan_1: mov al,stringbx cmp al,0 jz done ;实现对小写字母转换成大写cmp al,a;是大写字母jb next1 - 12 - 名师归纳总结 - - - - - - -第 12 页,共 19 页精选学习资料 - - - - - - - - - cmp al,z;是大写字母ja next1 sub al, 20h ;转换 mov stringbx, al next0: inc bx ;位移量加 1,指向下一字母 jmp chan_1 chan_2: mov al,stringbx cmp al,0 jz done ;实现对大写字母转换成小写cmp al,A;是大写字母jb next2 cmp al,Z;是大写字母ja next20 add al, 20h ;转换jmp next2 next20: cmp al,a;是大写字母jb next2 cmp al,z;是大写字母ja next2 sub al, 20h ;转换mov stringbx, al next2: inc bx ;位移量加 1,指向下一字母jmp chan_2 done: pop bx ;复原 bx ret change endp 习题 4.29编制一个子程序把一个16 位二进制数用十六进制形式在屏幕上显示出来,分别运用如下 3 种参数传递方法,并用一个主程序验证它;1采纳 AX 寄存器传递这个 16 位二进制数2采纳 wordTEMP 变量传递这个 16 位二进制数 16 位二进制数3采纳堆栈方法传递这个解答1采纳 AX 寄存器传递这个 16 位二进制数.model small .stack .data wdata dw 34abh .code .startup mov ax,wdata call dispa .exit 0 ; - 13 - 名师归纳总结 - - - - - - -第 13 页,共 19 页精选学习资料 - - - - - - - - - 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 ret dispa endp ; dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end 2采纳 wordTEMP变量传递这个16 位二进制数.model small .stack .data wdata dw 34abh wordtemp dw . .code .startup mov ax,wdata mov wordtemp,ax call dispa - 14 - 名师归纳总结 - - - - - - -第 14 页,共 19 页精选学习资料 - - - - - - - - - .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 call 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 ret dispa endp ; dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end 3采纳堆栈方法传递这个 16 位二进制数.model small .stack .data wdata dw 34abh .code .startup push wdata call dispa - 15 - 名师归纳总结 - - - - - - -第 15 页,共 19 页精选学习资料 - - - - - - - - - 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