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 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 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来完成。 宏调用:宏定义之后的使用。在使用宏指令的位置写下宏名,后跟实体参数。 宏指令:使用宏时,其形式很像指令,所以称为宏指令。
宏展开:在汇编时,汇编程序用对应的代码序列替代宏指令。 宏汇编:指使用宏的方法进行汇编语言程序设计。 〔习题4. 32〕
直接使用控制台输入和输出函数实现例题4-21的功能(不使用READMSG和DISPMSG子程序)。 〔解答〕
〔习题4. 33〕
直接使用控制台输出函数实现某个主存区域内容的显示(习题4.29的功能)。可以改进显示形式,例如每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。
〔解答〕
〔习题4. 34〕
如何进行很简单的修改,使得例题4-22程序的消息窗有“OK”和“Cancel”两个按钮。 〔解答〕
将MB_OK常量定义为1,即: MB_OK equ 1 〔习题4. 35〕
上机实践例题4-23和例题4-24,并在创建可执行文件的过程中生成汇编语言列表文件。 〔习题4.36〕
Pentium处理器含有一个64位的时间标记计数器(Time-Stamp Counter)。该计数器每个时钟周期递增(加1);在上电和复位后,该计数器清0。指令“RDTSC”执行后将在EDX(高32位)和EAX(低32位)返回当前的64位时间标记计数器值。利用RDTSC指令在某个函数运行前获得时间标记计数器值,然后运行该函数后,立即再次执行RDTSC指令,并将再次获得的时间标记计数器值与之前的计数值相减,得到的差值就是运行该函数需要的时钟周期数(乘以时钟周期,等于运行时间)。请利用混合编程方法显示某个函数的运行时钟周期数。 〔解答〕
第5章 微机总线 〔习题5.1〕简答题 〔解答〕
① 数据总线承担着处理器与存储器、外设之间的数据交换,既可以输入也可以输出,故其是双向的。
② 为减少引脚个数,8086采用了地址总线和数据总线分时复用。即数据总线在不同时刻还具有地址总线的功能。
③ 具有三态能力的引脚当输出呈现高阻状态时,相当于连接了一个阻抗很高的外部器件,信号无法正常输出;即放弃对该引脚的控制,与其他部件断开连接。
④ 处理器的运行速度远远快于存储器和I/O端口。处理器检测到存储器或I/O端口不能按基本的总线周期进行数据交换时,插入一个等待状态Tw。等待状态实际上是一个保持总线信号状态不变的时钟周期。
⑤ 猝发传送是处理器只提供首地址、但可以从后续连续的存储单元中读写多个数据。
⑥ 总线上可能连接多个需要控制总线的主设备,需要确定当前需要控制总线的主设备,所以需要总线仲裁。
⑦ 异步时序是由总线握手(Handshake)联络(应答)信号控制,不是由总线时钟控制。故总线时钟信号可有可无。
⑧ 单总线结构限制了许多需要高速传输速度的部件。32位PC机采用多种总线并存的系统结构。各种专用局部总线源于处理器芯片总线,以接近处理器芯片引脚的速度传输数据,它为高速外设提供速度快、性能高的共用通道。 ⑨ 4个。
⑩ 即插即用技术是指32位PC机的主板、操作系统和总线设备配合,实现自动配置功能。 〔习题5.2〕判断题 〔解答〕
① 对 ② 对 ③ 错 ④ 对 ⑤ 对 ⑥ 错 ⑦ 对 ⑧ 对 ⑨ 对 ⑩ 错 〔习题5.3〕填空题 〔解答〕 ① 0
② 读,写
③ 存储器读,存储器读,存储器写 ④ 4,2,10ns ⑤ 低有效,,0010 ⑥ 寻址,数据传送
⑦ 127,1.5Mb/s,12Mb/s ⑧ 地址,数据 ⑨ ,
⑩ ,I/O CH RDY 〔习题5.4〕
处理器有哪4种最基本的总线操作(周期)? 〔解答〕
存储器读、存储器写,I/O读、I/O写。 〔习题5.5〕
8086处理器的输入控制信号有RESET,HOLD,NMI和INTR,其含义各是什么?当它们有效时,8086 CPU将出现何种反应? 〔解答〕
RESET:复位输入信号,高电平有效。该引脚有效时,将迫使处理器回到其初始状态;转为无效时,CPU重新开始工作。
HOLD:总线请求,是一个高电平有效的输入信号。该引脚有效时,表示其他总线主控设备向处理器申请使用原来由处理器控制的总线。
NMI:不可屏蔽中断请求,是一个利用上升沿有效的输入信号。该引脚信号有效时,表示外界向CPU申请不可屏蔽中断。
INTR:可屏蔽中断请求,是一个高电平有效的输入信号。该引脚信号有效时,表示中断请求设备向处理器申请可屏蔽中断。 〔习题5.6〕
区别概念:指令周期、总线周期(机器周期)、时钟周期、T状态。 〔解答〕
指令周期:一条指令从取指、译码到最终执行完成的过程。 总线周期(机器周期):有数据交换的总线操作。
时钟周期:处理器的基本工作节拍,由时钟信号产生,一个高电平和一个低电平为一个周期。 T状态:完成特定操作的一个时钟周期。由于时间上一个T状态等于一个时钟周期,所以常常将两者混为一谈。 〔习题5.7〕
总结8086各个T状态的主要功能。 〔解答〕
T1状态:总线周期的第一个时钟周期主要用于输出存储器地址或I/O地址; T2状态:输出读/写控制信号。
T3状态:锁存地址、处理器提供的控制信号和数据在总线上继续维持有效,且T3时钟的前沿(下降沿)对READY引脚进行检测。READY信号有效,进入T4周期。
T4状态:总线周期的最后一个时钟周期,处理器和存储器或I/O端口继续进行数据传送,直到完成,并为下一个总线周期做好准备。
Tw状态:等待状态。处理器在T3前沿发现READY信号无效后,插入Tw。Tw状态的引脚信号延续T3时的状态、维持不变。 〔习题5.8〕
请解释8086(最小组态)以下引脚信号的含义:CLK,A19/S6~A16/S3,AD15~AD0,ALE,,和。默画它们在具有一个等待状态的存储器读总线周期中的波形示意。 〔解答〕
CLK:时钟输入。时钟信号是一个频率稳定的数字信号,其频率就是处理器的工作频率,工作频率