done:
mov al,bl rol al,4
call htoasc ; 调用子程序 call dispc ; 显示一个字符 mov al,bl
call htoasc ; 调用子程序 call dispc ; 显示一个字符 call dispcrlf jmp again
〔习题4.22〕编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。
〔解答〕 ; 代码段,主程序 mov eax,8F98FF00H call dispbd ; 调用子程序 ; 代码段,子程序 dispbd proc ; 32位二进制数的输出 push ecx push edx mov ecx,32 ; 要输出的字符个数 dbd: rol eax,1 ; AL循环左移一位 push eax and al,01h ; 取AL最低位 add al,30h ; 转化成相应的ASCLL码值 call dispc ; 以二进制的形式显示 pop eax loop dbd pop edx pop ecx ret dispbd endp
〔习题4.26〕
编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。
(1)采用EAX寄存器传递这个32位二进制数 (2)采用temp变量传递这个32位二进制数 (3)采用堆栈方法传递这个32位二进制数 〔解答〕
(1) ; 数据段
wvar word 307281AFH ; 代码段,主程序 mov eax,wvar call disp mov al,'H' call dispc ; 代码段,子程序 disp proc push ebx push ecx mov ecx,8 ; 8位 dhw1: rol eax,4 mov ebx,eax and al,0fh ; 转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp
(2) ; 数据段
wvar word 307281AFH temp word ? ; 代码段,主程序 mov eax,wvar mov temp,eax
call disp mov al,'H' call dispc ; 代码段,子程序 disp proc push ebx push ecx mov ecx,8 ; 8位 mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh ; 转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7
dhw2: call dispc ; 显示一个字符 mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp
(3) ; 数据段
wvar word 307281AFH ; 代码段,主程序 push wvar call disp add esp,4 mov al,'H' call dispc ; 代码段,子程序 disp proc push ebp mov ebp,esp push ebx push ecx mov ecx,8 ; 8位
dhw1:
dhw2:
disp
mov eax,[ebp+8] rol eax,4 mov ebx,eax and al,0fh ; 转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7 call dispc mov eax,ebx loop dhw1 pop ecx pop ebx pop ebp ret endp
〔习题4.28〕设计一个简单的两个整数的加法器程序。
〔解答〕 ;ex0428.asm include io32.inc .data
msg1 byte 'Enter the integers:',13,10,0
msg2 byte 13,10,'Enter space to continue! Enter any other key to exit!',13,10,0 .code start: mov eax,offset msg1 call dispmsg call readsid mov ebx,eax mov al,'+' call dispc call dispcrlf call readsid add ebx,eax
mov al,'=' call dispc mov eax,ebx call dispsid call dispcrlf mov eax,offset msg2 call dispmsg call readc cmp al,20h je start exit 0 end start
〔习题4. 31〕
区别如下概念:宏定义、宏调用、宏指令、宏展开、宏汇编。 〔解答〕
宏定义:就是对宏进行说明,由一对宏汇编伪指令MACRO和ENDM来完成。
宏调用:宏定义之后的使用。在使用宏指令的位置写下宏名,后跟实体参数。 宏指令:使用宏时,其形式很像指令,所以称为宏指令。 宏展开:在汇编时,汇编程序用对应的代码序列替代宏指令。 宏汇编:指使用宏的方法进行汇编语言程序设计。 第5章 微机总线 〔习题5.1〕简答题
(1)为什么称处理器的数据总线是双向的?
(2)8086的地址和数据总线为什么要分时复用? (3)具有三态能力的引脚输出高阻意味着什么? (4)总线周期中的等待状态是个什么工作状态? (6)总线数据传输为什么要进行总线仲裁? (7)异步时序为什么可以没有总线时钟信号? 〔解答〕
① 数据总线承担着处理器与存储器、外设之间的数据交换,既可以输入也可以输出,故其是双向的。
② 为减少引脚个数,8086采用了地址总线和数据总线分时复用。即数据总线在不同时刻还具有地址总线的功能。
③ 具有三态能力的引脚当输出呈现高阻状态时,相当于连接了一个阻抗很