第6章Windows编程
更新时间:2024-03-04 03:01:01 阅读量: 综合文库 文档下载
第6章Windows编程
6.1 简答题
(1)什么是应用程序接口(API)?
API是一些类型、常量和函数的集合,提供了编程中使用的库函数的途径。 (2)什么是静态连接?
连接程序从库文件中抽取需要的子程序插入到最终的可执行代码中,叫做静态连接。 (3)运行Windows应用程序,有时为什么会提示某个DLL文件不存在? Windows程序在运行时需要加载其配套的动态连接库DLL文件,当其没有被搜索到时就会提示不存在。
(4)ADDR与OFFSET有何不同?
都是地址操作符,后接标号或变量名表示它们的地址。但是addr只用在invoke语句中,获取局部变量的地址。 Offset只能获取全局变量的偏移地址。
(5)ExitProcess函数可以按汇编语言习惯全部使用小写字母表示吗?
不能,因为Windows的API函数按照C语言习惯区别大小写字母,是不同的 (6)Win32 API中可以使用哪两种字符集? 8位的ASCII字符集和16位的Unicode字符集
(7)为什么调用API函数之后,ECX等寄存器改变了?
因为API函数并不是按照汇编语言的规则编写的,它的规则是不保护它们 (8)条件控制“.IF”伪指令的条件是在汇编阶段进行判断吗?
不是。条件控制伪指令在会变阶段要转换为一组功能相当等比较、测试喝转移指令,是在执行阶段进行判断的。
(9)为什么32位api函数的地址指针也可以转换为汇编语言的双字类型? 32位api函数的地址指针与汇编语言的双字类型DWORD相对应
(10)在masm32软件包支持下的汇编语言程序中为什么没有看到对windows常量、函数等的定义和声明?
对windows常量、函数等的定义和声明已经包含在windows.inc、kerne;32.inc及user32.inc等文件中。
6.2 判断题
(1)Windows可执行文件中包含动态连接库中的代码。 错,不含,运行时才加载
(2)导入库文件和静态子程序库文件的扩展名都是.lib,所以两者性质相同。
错,导入库中记录的是动态连接库中函数等的名称及存储位置等信息,不含执行代码。 (3)INVOKE语句只能传递主存操作数,不能传递寄存器值。 错,可以使用寄存器参数
(4)Windows控制台是命令行窗口,也就是MS-DOS窗口。 错,Windows控制台与DOS窗口本质不同
(5)与高级语言类似,汇编语言中使用结构变量也需要先说明结构类型 对
(6)proc伪指令可以使用uses操作符,但是proto伪指令不可以使用。 对
(7)在宏定义中,local伪指令声明标识符;而在过程定义中,local伪指令用于分配局部变
量。 对
(8)条件汇编IF和条件控制.IF伪指令都包括条件表达式,它们的表达形式一样。 对
(9)条件控制.IF伪指令和循环控制伪指令.WHILE中的条件表达式具有相同的表达形式。 对
(10)masm32软件包只支持32位图形界面应用程序的开发,不支持控制台应用程序的开发。 错。
6.3 填空题
(1)Windows系统有3个最重要的系统动态连接库文件,它们是________、________和________。
KERNEL32.DLL,USER32.DLL,GDI32.DLL
(2)进行windows应用程序开发时,需要( )库文件;执行该应用程序时,则需要对应的( )库文件。 导入库,动态链接库
(3)获得句柄函数GetStdHandle执行结束,使用_______提供返回结果。 EAX
(4)函数GetStdHandle需要一个参数,对标准输入设备应该填入( )数值,对标准输出设备应该填入 ( )数值,对边准错误输出设备应该填入( )数值 -10,-11,-12
(5)调用ReadConsole函数时,用户在键盘上按下数字8,然后回车,则键盘缓冲区的内容一次是( )。 38h,0dh,0ah
(6)WriteConsole和ReadConsole函数的参数类似,都有5个,第1个参数是______,第2个参数是输出或输入缓冲区的______,第3个参数是输出或输入的字符_______,第4个参数指向实际输出或输入字符个数的变量,最后1个参数一般要求代入_____。 句柄实例,地址,个数,0
(7)消息窗口函数MessageBox有4个参数,第1个是0,第2个是要显示字符串的(),第3个是()的地址指针,第4个参数指明窗口形式。注意字符串要使用()作为结尾标志。 地址指针(即首地址),窗口标题,0
(8)要使用获取系统日期时间函数GetLocalTime,需要定义一个()结构变量,其中返回系统时间数值,这些数值采用2进制编码,例如,日期返回的编码是0019h,它表示日期是()。
SYSTEMTILE,25
(9)使用扩展的proc伪指令编写子程序比较方便,例如,子程序中需要保护和恢复esi和edi寄存器,就只需要使用()既可以。 Uses esi edi
(10)masm进行汇编时生成最大化源代码列表,其中语句前使用字母()表示是通过包含文件插入的语句,使用“*”符号的语句是()的代码,而语句前的数字则说明是()语句。 C,汇编程序生成,宏调用
习题6.4
执行CPUID指令,直接使用控制台输出函数将处理器识别字符串显示出来。 .686 .model flat,stdcall option casemap:none includelib bin\\kernel32.lib ExitProcess proto,:dword GetStdHandle proto,:dword WriteConsoleA\\ proto,:dword,:dword,:dword,:dword,:dword WriteConsole equ
outbuffer byte 'The processor ……', 12 dup(0) outbufsize = sizeof outbuffer outsize dword ?
.code mov eax,0
cpuid ;执行处理器识别指令
mov dword ptr outbuffer+outbufsize-12,ebx mov dword ptr outbuffer+outbufsize-8,edx mov dword ptr outbuffer+outbufsize-4,ecx invoke GetStdHandle,STD_OUTPUT_HANDLE mov outhandle,eax
invoke WriteConsole,outhandle,\\
addr outbuffer,outbufsize,addr outsize,0 invoke ExitProcess,0
习题6.5
直接使用控制台输入和输出函数实现例6-2的功能(不使用readmsg,dispmsg).注意,输入和输出句柄只要各获取一个既可。 .686 .model flat,stdcall option casemap:none includelib bin\\kernel32.lib ExitProcess proto,:dword exit macro dwexitcode invoke ExitProcess,dwexitcode endm
GetStdHandle proto,:dword WriteConsoleA proto,:dword,:dword,:dword,:dword,:dword WriteConsole equ
ReadConsoleA proto,:dword,:dword,:dword,:dword,:dword ReadConsole equ
习题6.6
直接使用控制台输出函数实现某个主存区域内容的显示。要求改进显示形式,例如,每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。
.data
var byte 'This is a test!','ABCDEFG','0123456789' _outsize dword ? _outhandle dword ?
_membuffer byte 57 dup(20h),13,10
.code start: mov eax,offset var mov ecx,sizeof var call dispmem invoke ExitProcess,0 dispmem proc test ecx,ecx ;个数为0,不显示 jz dispm11 ;退出 pushad
mov esi,ecx ;ESI=要显示内容的字节数 mov edi,eax ;EDI=要显示内容的地址
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov _outhandle,eax ;获得输出句柄 ;1.显示缓冲区全部填充为空格
dispm1: xor ebx,ebx ;指示显示缓冲区 dispm2: mov _membuffer[ebx],' ' inc ebx cmp ebx,(sizeof _membuffer)-2 jb dispm2 ;2.显示内容所在的存储器地址 xor ebx,ebx mov ecx,8 ;地址是十六进制8位 mov eax,edi dispm3: rol eax,4 mov dl,al and dl,0fh or dl,30h cmp dl,39h jbe dispm4 add dl,7
dispm4: mov _membuffer[ebx],dl inc ebx loop dispm3 mov _membuffer[ebx],':' ;显示冒号 add ebx,2 mov ecx,16 ;一行最多显示16个字节 ;3.显示一个字节内容 dispm5: mov al,[edi] mov dl,al shr dl,4 or dl,30h cmp dl,39h jbe dispm6 add dl,7
dispm6: mov _membuffer[ebx],dl inc ebx and al,0fh or al,30h cmp al,39h jbe dispm7 add al,7
dispm7: mov _membuffer[ebx],al add ebx,2
inc edi ;指向下一个要显示的字节 dec esi jz dispm10 ;没有要显示的内容,退出 loop dispm5
invoke WriteConsole,_outhandle,\\ addr _membuffer,sizeof _membuffer,\\ addr _outsize,0 jmp dispm1
dispm10: invoke WriteConsole,_outhandle,\\ addr _membuffer,sizeof _membuffer,\\ addr _outsize,0 popad dispm11: ret dispmem endp
习题6.7
执行CPUID指令,在消息窗口显示处理器识别字符串,要求该消息窗有OK和Cancel两个按钮。
MessageBoxA proto :dword,:dword,:dword,:dword MessageBox equ
outbuffer byte '本机的处理器是', 12 dup(0),0 outbufsize = sizeof outbuffer-1 .code start: mov eax,0 cpuid ;执行处理器识别指令 mov dword ptr outbuffer+outbufsize-12,ebx mov dword ptr outbuffer+outbufsize-8,edx mov dword ptr outbuffer+outbufsize-4,ecx invoke MessageBox,NULL,addr outbuffer,\\ addr szCaption,MB_OK invoke ExitProcess,NULL
end start
习题6.8
参考5-10,利用MessageBox函数创建的消息窗口显示32位通用寄存器内容。 .686 .model flat,stdcall option casemap:none includelib ..\\lib\\kernel32.lib includelib ..\\lib\%user32.lib ExitProcess proto,:dword exit macro dwexitcode invoke ExitProcess,dwexitcode endm
GetStdHandle proto,:dword WriteConsoleA proto,:dword,:dword,:dword,:dword,:dword WriteConsole equ
MessageBoxA proto,:dword,:dword,:dword,:dword MessageBox equ
dreg32 macro reg32 local dreg1,dreg2 mov eax,reg32 ;;显示reg32寄存器 mov ecx,8 xor ebx,ebx dreg1: rol eax,4 mov edx,eax and dl,0fh add dl,30h ;;转化为相应的ASCII码值 cmp dl,39h ;;区别0~9和A~F数码 jbe dreg2 add dl,7
dreg2: mov rd®32&[ebx+4],dl inc ebx cmp ebx,ecx jb dreg1 endm .data strCaption byte '32位通用寄存器内容',0 rdeax byte 'EAX=00000000, ' rdebx byte 'EBX=00000000, ' rdecx byte 'ECX=00000000, '
rdedx byte 'EDX=00000000',13,10 rdesi byte 'ESI=00000000, ' rdedi byte 'EDI=00000000, ' rdebp byte 'EBP=00000000, ' rdesp byte 'ESP=00000000',13,10,0 _outsize dword $ - rdeax _outhandle dword ? .code start: invoke GetStdHandle,STD_OUTPUT_HANDLE mov _outhandle,eax
mov eax,12345678h mov ebx,0abcdef00h mov ecx,eax mov edx,ebx
mov esi,11111111h mov edi,22222222h mov ebp,esp call dprd exit 0 dprd proc pushad push edx push ecx push ebx
;假设一些数据
dreg32 eax ;显示EAX pop ebx
dreg32 ebx ;显示EBX pop ecx
dreg32 ecx ;显示ECX pop edx
dreg32 edx ;显示EDX dreg32 esi ;显示ESI dreg32 edi ;显示EDI dreg32 ebp ;显示EBP
add esp,36 ;获得进入该子程序前的ESP dreg32 esp ;显示ESP sub esp,36 ;恢复ESP mov eax,offset rdeax
invoke MessageBox ,0 ,eax , addr strCaption,0 popad ret
dprd endp end start
习题6.9
利用获得系统时间函数,将年月日时分秒星期等时间完整地显示出来。可以创建一个控制台程序,也可以创建一个消息窗口程序。
习题6.10
结构数据类型如何说明,结构变量如何定义,结构字段如何引用 略
习题6.11
条件控制伪指令的条件表达式中,逻辑与“&&”表示两者都为真,整个条件才为“真”;逻辑或“||”表示两者之一为真,整个条件就为“真”。对如下两个程序段(var是一个双字变量):
(1)逻辑与条件
.if (var==5)&&(eax!=ebx) Inc eax .endif (2)逻辑或条件
.if (var==5)||(eax!=ebx) Dec ebx .endif
请直接使用处理器指令实现上述分支结构,并比较汇编程序生成的代码序列。 答: (1) Cmp var,5 Jne done Cmp eax,ebx Je done Inc eax Done: (2) Cmp var,5 Je l1
Cmp eax,ebx Je done L1: Dec ebx Done:
习题6.12
对于如下两个程序段: (1)WHILE循环结构 .while eax !=10 Mov [ebx*4],eax Inc eax .endw
(2)UNTIL循环结构 .repeat
Mov [ebx*4],eax Inc eax
.until eax ==10
请直接使用处理器指令实现上述分支结构,并比较汇编程序生成的代码序列。 答: (1) Next:
Cmp eax,10 Je done
Mov [ebx*4],eax Inc eax Jmp next done: (2) Next:
Mov [ebx*4],eax Inc eax Cmp eax,10 Jne next
习题6.13
使用条件控制.if伪指令编写习题4.16程序,并生成完整的列表文件 test dvar,80000000h .if ! ZERO? mov al,'L' .else test dvar,1 .if ! ZERO? mov al,'R' .else mov al,'M'; .endif .endif call dispc
习题6.14
使用条件控制.if和循环控制.while伪指令编写习题4.21程序,并生成完整的列表文件 xor eax,eax xor ebx,ebx mov ecx,lengthof string .while (ecx !=0) .if (string[ebx]==20h) inc eax .endif inc ebx dec ecx .endw
习题6.15
调用GetCommandLine函数,可以从eax返回指向命令行输入字符串(包含路径、文件名和参数)。要求编程利用MessageBox函数输出这个字符串。 .686 .model flat,stdcall option casemap:none includelib ..\\lib\\kernel32.lib includelib ..\\lib\%user32.lib ExitProcess proto,:dword
MessageBoxA proto :dword,:dword,:dword,:dword MessageBox equ
GetCommandLineA proto
GetCommandLine equ
szCaption byte '命令行内容' .code start:
; 主程序
invoke GetCommandLine
invoke MessageBox,0,eax,addr szCaption,MB_OK invoke ExitProcess,0 ; 子程序 end start
习题6.16
在windows窗口应用程序中例6-11的基础上,增加单击鼠标右键弹出另一个消息窗口的功
能,在masm32开发环境生成可执行文件。
正在阅读:
第6章Windows编程03-04
牛津上海版八上Chapter6《Nobodywins(PartⅠ)》word学习辅导材料03-08
浅议工程施工阶段工程造价控制的方法12-15
口香糖流浪记作文600字07-12
纸船作文500字06-27
雨中的感动作文800字07-01
记一次科技展览作文400字06-23
第四章统计数据描述指标习题12-29
《物权法解释一》第十九条:善意取得中合理价格的认定01-23
柔性激振的频响函数法损伤检测数据获取系统05-11
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- Windows
- 编程
- 论虚开增值税专用发票案件的特点及侦查对策
- 滑模组装技术交底记录
- CDMA2000核心网演进组网策略探讨
- 浅析常见药物的不良反应及预防措施
- 厦门大学网络教育2014-2015学年第二学期《大学语文》课程复习题
- 电子校务建设(统一门户平台、统一身份认证平台和统一数据库平台
- 汽车轮胎知识大全
- 八年级语文上册古文期末复习题
- 上海市长宁区2018届高三下学期教学质量检测(二模)物理试题
- 分析高中生物实验能力的培养
- 新华书店演讲稿
- 甲级单位编制水泵脱粒机项目可行性报告(立项可研+贷款+用地+201
- 社区治理现代化中社会组织合作治理策略研究
- 报销注意事项
- 供销社社有资产监管的思考
- 德育课题组
- 淀粉酶(AMS)检测试剂盒(碘-淀粉微板法)
- 常见航空运输知识问答
- 青岛版小学三年级科学上册期末复习题
- DMP3300系列线路说明书