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

2026/4/28 19:03:39

jnz nextl test eax,1 jnz nextr mov al,'M' jmp done

nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc

〔习题4.11〕编写一个程序,先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。 〔解答〕

; 数据段

inmsg byte 'Input number(0~9): ',0

ermsg byte 0dh,0ah,'Error! Input again: ',0 ; 代码段 mov eax,offset inmsg ; 提示输入数字 call dispmsg

again: call readc ; 等待按键

cmp al,'0' ; 数字 < 0? jb erdisp

cmp al,'9' ; 数字 > 9? ja erdisp

call dispcrlf call dispc

jmp done

erdisp: mov eax,offset ermsg call dispmsg jmp again done:

〔习题4.12〕

有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。

mov ecx,20 mov eax,0

mov esi,eax

sumlp: add eax,array[esi]

add esi,4 loop sumlp mov total,eax

〔解答〕

求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。

〔习题4.13〕

编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在SPACE单元。 〔解答〕

; 数据段

;以0结尾的字符串

string byte 'Do you have fun with Assembly ?',0 space dword ? ; 代码段 mov esi,offset string xor ebx,ebx ;EBX用于记录空格数 again: mov al,[esi]

cmp al,0 jz done

cmp al,20h ;空格的ASCII码是20H jne next

;不相等、不是空格,转移

inc bx ;相等、是空格,空格个数加1

next: inc esi jmp again ;继续循环 done: mov space,ebx 〔习题4.14〕

;保存结果

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

; 数据段

array word 2005,2008,98 dup (1394) wordsum word ?

error byte 'Overflow !',0 ; 代码段 and ebx,0

mov ecx,100 xor ax,ax

; 假设100个16位正整数

again: add ax,array[ebx*2] jc over inc ebx

loop again

mov wordsum,ax

over: mov eax,offset error call dispmsg

〔习题4.15〕

在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。 〔解答〕

; 数据段

string byte 'If you find any error in the program, you can DEBUG it.' count = sizeof string bug byte 'BUG'

; 代码段

mov ecx,count

mov edi,offset string

L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al

jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y'

jmp L3 L2: pop edi

inc edi loop L1

mov al,'N' L3: call dispc 〔习题4.16〕

主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。 〔解答〕 ; 数据段

bcd dword 00371002h ; 代码段

mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc

jmp done

goon: mov ecx,8

xor ebx,ebx ; EBX=0,表示可能是前导0 again: rol esi,4

mov eax,esi

and eax,0fh ; EAX低4位保存当前要显示的BCD码 cmp ebx,0

; EBX≠0,说明不是前导0,要显示

jnz disp ; EBX=0,说明可能是前导0 cmp eax,0

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

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

disp: add al,30h call dispc

next: loop again

done:

〔习题4.17〕

已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。 〔解答〕 ; 数据段 string 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

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

inlp: inc edi

mov al,string[edi] ; 前移一个位置 mov string[edi-1],al

cmp edi,ecx jb inlp

next: dec esi ; 继续进行 cmp esi,0

jnz outlp ; 为0结束

lea eax,string ; 显示处理后的字符串

call dispmsg done:

〔习题4.18〕

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

.data

table 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)

tab1

byte 0 .code

start: mov ebx,offset tab1 mov edx,'| 02'


微机原理与接口技术(钱晓捷版)课后习题答案.doc 将本文的Word文档下载到电脑
搜索更多关于: 微机原理与接口技术(钱晓捷版)课后习题答案 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219