(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 dhw1: rol eax,4 mov ebx,eax and al,0fh 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
mov eax,temp dhw1: rol eax,4
mov ebx,eax
位 转换为ASCII码 位 -36
- ; 8; ; 8
dhw2:
disp
wvar
disp
dhw1:
dhw2:
disp
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 ret endp
; 数据段
word 307281AFH ; 代码段,主程序 push wvar call disp add esp,4 mov al,'H' call dispc
; 代码段,子程序 proc push ebp mov ebp,esp push ebx push ecx mov ecx,8 ; 8位 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
(3)
〔习题4.27〕
配合例题4-11的简单加密解密程序,设计一个输入密码的程序,将输入的若干字符经过适当算法得到一个字节量密码。 〔解答〕
;ex0427.asm
- -37
include io32.inc .data key byte ? msg0 byte 'Enter your password:',0 passw byte 50 dup(0)
errormsg byte 'Password error, input again!',13,10,0 bufnum = 255
buffer byte bufnum+1 dup(0) ; 定义键盘输入需要的缓冲区 msg1 byte 'Enter messge: ',0 msg2 byte 'Encrypted message: ',0 msg3 byte 'Original messge: ',0 .code start: mov eax,offset msg0 ; 提示输入加密密码 call dispmsg mov eax,offset passw ; 设置入口参数EAX call readmsg ; 调用输入字符串子程序输入密码 mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again0: inc ebx xor al,passw[ebx] ;使用简单的异或方法得到加密关键字 loop again0 mov key,al ; 保存加密关键字 mov eax,offset msg1 ; 提示输入字符串 call dispmsg mov eax,offset buffer ; 设置入口参数EAX call readmsg ; 调用输入字符串子程序 push eax ; 字符个数保存进入堆栈 mov ecx,eax ; ECX=实际输入的字符个数,作为循环的次数 xor ebx,ebx ; EBX指向输入字符 encrypt: mov al,key ; AL=加密关键字 xor buffer[ebx],al ; 异或加密 inc ebx dec ecx ; 等同于指令:loop encrypt jnz encrypt ; 处理下一个字符 mov eax,offset msg2 call dispmsg mov eax,offset buffer ; 显示加密后的密文 call dispmsg call dispcrlf ;
again: mov eax,offset msg0 ; 提示输入解密密码 call dispmsg mov eax,offset passw ; 设置入口参数EAX call readmsg ; 调用输入字符串子程序输入密码 mov ecx,eax dec ecx
- -38
xor ebx,ebx mov al,passw[ebx] again1: inc ebx xor al,passw[ebx] ;使用简单的异或方法得到加密关键字 loop again1 cmp key,al ; 与原加密关键字比较 jz next ; 密码相同,则进行解密 mov eax,offset errormsg ; 提示输入解密密码错误 call dispmsg jmp again
next: pop ecx ; 从堆栈弹出字符个数,作为循环的次数 xor ebx,ebx ; EBX指向输入字符 decrypt: mov al,key ; AL=解密关键字 xor buffer[ebx],al ; 异或解密 inc ebx dec ecx jnz decrypt ; 处理下一个字符 mov eax,offset msg3 call dispmsg mov eax,offset buffer ; 显示解密后的明文 call dispmsg
〔习题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
- -39
mov eax,offset msg2 call dispmsg call readc cmp al,20h je start exit 0 end start
〔习题4.29〕
利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX=主存偏移地址,ECX=字节个数(主存区域的长度)。同时编写一个主程序进行验证。 〔解答〕
;ex0429.asm in Windows Console include io32.inc .data var byte 'This is a test!' .code start: ; 主程序 mov eax,offset var mov ecx,sizeof var call dispmem exit 0 ; 子程序 dispmem proc push ebx mov ebx,eax dispm1: mov al,[ebx] call disphb mov al,' ' call dispc inc ebx loop dispm1 pop ebx ret dispmem endp end start
〔习题4.30〕
将例题4-19分别使用子程序模块、子程序库和子程序库包含方法生成最终可执行文件。 〔习题4. 31〕
区别如下概念:宏定义、宏调用、宏指令、宏展开、宏汇编。 〔解答〕
宏定义:就是对宏进行说明,由一对宏汇编伪指令MACRO和ENDM来完成。 宏调用:宏定义之后的使用。在使用宏指令的位置写下宏名,后跟实体参数。 宏指令:使用宏时,其形式很像指令,所以称为宏指令。 宏展开:在汇编时,汇编程序用对应的代码序列替代宏指令。
- -40
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库微机原理与接口技术_第四版_答案_钱晓捷_机械工业出版社(8)在线全文阅读。
相关推荐: