《汇编语言与接口技术》习题解答(第三章) 下载本文

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================

ret asctob endp

习题3.34-1 问题:

? 编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检

查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。

解答:;数据段

array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h count equ $-array ;数组元素个数 result db ? ;校验和 ;代码段(主程序) mov bx,offset array ;BX←数组的偏移地址 mov cx,count ;CX←数组的元素个数 call checksum ;调用求和过程 mov result,al ;处理出口参数

习题3.34-2

;代码段(子程序)

;计算字节校验和的通用过程

;入口参数:DS:BX=数组的段地址:偏移地址 CX=元素个数 ;出口参数:AL=校验和

;说明:除AX/BX/CX外,不影响其他寄存器 checksum proc xor al,al ;累加器清0 sum: add al,[bx] ;求和 inc bx ;指向下一个字节 loop sum ret checksum endp

〔习题3.17〕

已知用于LED数码管的显示代码表为:

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显示代码。

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================================

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================

〔解答〕

;数据段

LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0clh,86h,8eh lednum db 0ah ; 代码段

〔习题3.21〕

例题3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段。 〔解答〕

;代码段

mov al,number mov bx,0 ;BX←记录为1的位数 restart: cmp al,0 ;AL=0结束 again: next: fun0: fun1: fun2: fun3: fun4: fun5: fun6:

jz done

shr al,1 ;最低位右移进入CF jc next ;为1,转移 inc bx ;不为1,继续

jmp again push ax push bx

shl bx,1 ;位数乘以2(偏移地址要用2个字节单元) jmp addrs[bx] ;间接转移:IP←[table+BX] ;以下是各个处理程序段 mov dl,'0' jmp disp mov dl,'1' jmp disp mov dl,'2' jmp disp mov dl,'3' jmp disp mov dl,'4' jmp disp mov dl,'5' jmp disp mov dl,'6' jmp disp

mov bx, offset LEDtable mov al, lednum xlat ;al中存有对应的LED显示代码

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================================

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================

fun7: disp: mov dl,'7' jmp disp

mov ah,2 ;显示一个字符

int 21h pop bx pop ax jmp restart done: … 〔习题3.24〕

编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘Overflow !’。 〔解答〕

;数据段

count equ 100

parray dw count dup(?) ;假设有100个数据 wordsum dw 0 msg db ‘overflow’,’$’ ;代码段 again:

mov cx,count

mov ax,0

mov bx,offset parray add ax,[bx] jnc next

mov dx,offset msg mov ah,9

int 21h ;显示溢出信息 jmp done ;然后,跳出循环体

next: add bx,2

loop again mov wordsum,ax done: …

〔习题3.25〕

编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。 〔解答〕

array

;wjxt325.asm .model small .stack 256 .data dw ? ;源字数据

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================================

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================

dbcd again:

db 5 dup(?) ;五位bcd结果,高对高低对低

.code .startup mov dx, array ;取源数据(余数) mov bx, 10000 ;除数 mov cx, 10 ;除数系数

mov si, 4 ;目的数据高位位移量 mov ax, dx ;dx.ax中存放被除数 mov dx, 0

div bx ;除于bx,商ax,余数dx mov dbcd[si], al ;商<10,存结果 push dx ;暂存余数

mov ax, bx ;除数除于10

mov dx,0

div cx ;dx.ax除于cx,商ax、余数0存在dx mov bx, ax ;bx是除数 pop dx

dec si ;目的数据位移量减1 jnz again

mov dbcd, dl ;存个位数( < 10 )

.exit 0 end 〔习题3.27〕

编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。请调用书中的HTOASC子程序。 〔解答〕

again:

mov ah,1

int 21h cmp al,1bh

;ESC的ASCII码是1bh

je done call htoasc mov ah,2 int 21h jmp again done: 〔习题3.29〕

调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。 〔解答〕

DIPASC proc

push cx push dx push ax

;入口参数:AL=要显示的一个16进制数

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================================

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================

mov cl,4 ;转换高位 shr al,cl

call HTOASC mov dl,al ;显示 mov ah,2 int 21h

pop ax ;转换低位 call HTOASC mov dl,al ;显示 mov ah,2 int 21h mov dl,’H’

;显示一个字母“H”

mov ah,2 int 21h pop dx pop cx ret DIPASC endp

HTOASC proc ;将AL低4位表达的一位16进制数转换为ASCII码 and al,0fh cmp al,9 jbe htoasc1 add al,37h ;是0AH~0FH,加37H转换为ASCII码 ret ;子程序返回

htoasc1: add al,30h ;是0~9,加30H转换为ASCII码 ret ;子程序返回 HTOASC

〔习题3.35〕

endp

编制3个子程序把一个16位二进制数用4位16进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。

⑴ 采用AX寄存器传递这个16位二进制数 ⑵ 采用temp变量传递这个16位二进制数 ⑶ 采用堆栈方法传递这个16位二进制数 〔解答〕

⑴ wdata

.model small

.stack .data dw 34abh .code .startup

mov ax,wdata

--------------------------可以编辑的精品文档,你值得拥有,下载后想怎么改就怎么改---------------------------

==========================================================================