1、汇编语言与接口技术习题解答第三章汇编语言与接口技术习题解答(第三章)D je case0 cmp al,1 jz case1 cmp al,2 jz case2 jmp donecase0: cmp byte ptr bx,0 je done cmp byte ptr bx,A jb next0 cmp byte ptr bx,Z ja next0 add byte ptr bx,20hnext0: inc bx jmp case0case1: cmp byte ptr bx,0 je done cmp byte ptr bx,a jb next1 cmp byte ptr bx,z ja n
2、ext1 sub byte ptr bx,20hnext1: inc bx jmp case1case2: cmp byte ptr bx,0 je done cmp byte ptr bx,A jb next2 cmp byte ptr bx,Z ja next20 add byte ptr bx,20h jmp next2next20: cmp byte ptr bx,a jb next2 cmp byte ptr bx,z ja next2 sub byte ptr bx,20hnext2: inc bx jmp case2done: pop bx retlucase endp习题3.1
3、解答:参考教材(第60页)习题3.6问题:给出你采用一个源程序格式书写的例题3.1源程序解答: .model small .stack .datastring db Hello, Assembly !,0dh,0ah,$ .code start: mov ax,data mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h end start习题3.12解答:ORG伪指令习题3.13解答:段地址和偏移地址属性,类型属性习题3.26问题:过程定义的一般格式是怎样的?子程序开始为什么常有PUSH指令、返回前为什么常
4、有POP指令?下面完成16位无符号数累加的子程序有什么不妥吗?若有,请改正:解答:crazy PROC ;crazy PROC push ax ; 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 inc bx ; inc bx inc bx ; inc bx loop again ; loop again ret ; ret ENDP crazy ; crazy ENDP字量求和子程序入口参数:BX数据首址CX数据个数出口参数:AX和的低字DX和的
5、高字(进位部分)习题3.28问题:请按如下说明编写子程序:;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数;入口参数:DH十位数的ASCII码,DL个位数的ASCII码;出口参数:AL对应的二进制数解答:asctob proc push cx ;先转换十位数 and dh,0fh shl dh,1 ;乘以10 mov ch,dh shl dh,1 shl dh,1 add dh,ch;转换个位数 and dl,0fh ;十位数加个位数 add dh,dl ;设置出口参数 mov al,dh pop cx retasctob endp习题3.341问题:编写一个计算字节校验和的
6、子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。解答:;数据段array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90hcount equ $-array ;数组元素个数result db ? ;校验和 ;代码段(主程序) mov bx,offset array ;BX数组的偏移地址 mov cx,count ;CX数组的元素个数 call checksum ;调用求和过程 mov result,al ;处理出口参数习题3.342;代
7、码段(子程序);计算字节校验和的通用过程;入口参数:DS:BX数组的段地址:偏移地址 CX元素个数;出口参数:AL校验和;说明:除AX/BX/CX外,不影响其他寄存器checksum proc xor al,al ;累加器清0sum: add al,bx ;求和 inc bx ;指向下一个字节 loop sum retchecksum endp习题3.17已知用于LED数码管的显示代码表为:LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示09、AF这16个数码的显
8、示代码。现编写一个程序实现将lednum中的一个数字(09、AF)转换成对应的LED显示代码。解答 ;数据段LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0clh,86h,8ehlednum db 0ah ; 代码段 mov bx, offset LEDtable mov al, lednum xlat ;al中存有对应的LED显示代码习题3.21例题3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段。解答;代码段 mov
9、 al,number mov bx,0 ;BX记录为1的位数restart: cmp al,0 ;AL0结束 jz doneagain: shr al,1 ;最低位右移进入CF jc next ;为1,转移 inc bx ;不为1,继续 jmp againnext: push ax push bx shl bx,1 ;位数乘以2(偏移地址要用2个字节单元) jmp addrsbx ;间接转移:IPtableBX ;以下是各个处理程序段fun0: mov dl,0 jmp dispfun1: mov dl,1 jmp dispfun2: mov dl,2 jmp dispfun3: mov dl
10、,3 jmp dispfun4: mov dl,4 jmp dispfun5: mov dl,5 jmp dispfun6: mov dl,6 jmp dispfun7: mov dl,7 jmp dispdisp: mov ah,2 ;显示一个字符 int 21h pop bx pop ax jmp restartdone: 习题3.24编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示Overflow !。解答 ;数据段count equ 100parray dw count dup(?) ;假设有100个数据wordsum
11、 dw 0msg db overflow,$ ;代码段 mov cx,count mov ax,0 mov bx,offset parrayagain: add ax,bx jnc next mov dx,offset msg mov ah,9 int 21h ;显示溢出信息 jmp done ;然后,跳出循环体next: add bx,2 loop again mov wordsum,axdone: 习题3.25编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以
12、100、10和1,得到“百位”、“十位”和“个位”。解答 ;wjxt325.asm .model small .stack 256 .data array dw ? ;源字数据 dbcd db 5 dup(?) ;五位bcd结果,高对高低对低 .code .startup mov dx, array ;取源数据(余数) mov bx, 10000 ;除数 mov cx, 10 ;除数系数 mov si, 4 ;目的数据高位位移量 again: mov ax, dx ;dx.ax中存放被除数 mov dx, 0 div bx ;除于bx,商ax,余数dx mov dbcdsi, al ;商10,
13、存结果 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 ca
14、ll htoasc mov ah,2 int 21h jmp againdone: 习题3.29调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。解答DIPASC proc ;入口参数:AL要显示的一个16进制数 push cx push dx push ax 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
15、21h pop dx pop cx retDIPASC endpHTOASC proc ;将AL低4位表达的一位16进制数转换为ASCII码 and al,0fh cmp al,9 jbe htoasc1 add al,37h ;是0AH0FH,加37H转换为ASCII码 ret ;子程序返回htoasc1: add al,30h ;是09,加30H转换为ASCII码 ret ;子程序返回HTOASC endp习题3.35编制3个子程序把一个16位二进制数用4位16进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。 采用AX寄存器传递这个16位二进制数 采用tem
16、p变量传递这个16位二进制数 采用堆栈方法传递这个16位二进制数解答 .model small .stack .datawdata dw 34abh .code .startup mov ax,wdata 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
17、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 .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
18、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 retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2 int 21h pop ax
19、 retdldisp endp end .model small .stack .datawdata dw 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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1