微机原理与接口技术(钱晓捷1版)课后习题答案

disp:

next: done: cmp eax,0 jz next mov ebx,1 add al,30h call dispc loop again

; EAX=0,说明是前导0,不显示

; EAX≠0,没有前导0了,令EBX=1≠0

〔习题4.17〕

已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。 〔解答〕

string

outlp:

inlp:

next:

done:

; 数据段

byte 'Let us have a try !',0dh,0ah,0 ; 代码段

mov ecx,sizeof string cmp ecx,2 jb done

lea eax,string ; 显示处理前的字符串 call dispmsg mov esi,ecx dec esi

cmp string[esi],' ' ; 检测是否是空格 jnz next ; 不是空格继续循环 mov edi,esi ; 是空格,进入剔除空格分支 dec ecx inc edi

mov al,string[edi] ; 前移一个位置 mov string[edi-1],al cmp edi,ecx jb inlp dec esi ; 继续进行 cmp esi,0 jnz outlp ; 为0结束 lea eax,string ; 显示处理后的字符串 call dispmsg

〔习题4.18〕

第3章习题3.14在屏幕上显示ASCII表,现仅在数据段设置表格缓冲区,编程将ASCII代码值填入留出位置的表格,然后调用显示功能实现(需要利用双重循环)。 〔解答〕

table

tab1

include io32.inc .data

byte ' |0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+-------------------------------',13,10 byte 6 dup(36 dup(?),13,10) byte 0 .code

- -25

start:

again0:

again1:

mov ebx,offset tab1 mov edx,'| 02' mov ax,2020h mov esi,6

mov [ebx],edx add ebx,4 mov ecx,16

mov word ptr [ebx],ax add ebx,2 inc al

loop again1 add ebx,2 add edx,1 dec esi jnz again0

mov eax,offset table call dispmsg exit 0 end start

〔习题4.19〕

请按如下说明编写子程序:

子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码 入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 出口参数:AL=对应BCD码 〔解答〕

asctob

asctob

proc

shl dh,4 mov al,dh and dl,0fh or al,dl ret endp

〔习题4.20〕

乘法的非压缩BCD码调整指令AAM执行的操作是:AH←AL÷10的商,AL←AL÷10的余数。利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下:

xor a

>>展开全文<<
12@gma联系客服:779662525#qq.com(#替换为@)