ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:26.21KB ,
资源ID:10488717      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-10488717.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章Windows编程.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

第6章Windows编程.docx

1、第6章Windows编程第6章Windows编程6.1 简答题(1)什么是应用程序接口(API)?API是一些类型、常量和函数的集合,提供了编程中使用的库函数的途径。(2)什么是静态连接?连接程序从库文件中抽取需要的子程序插入到最终的可执行代码中,叫做静态连接。(3)运行Windows应用程序,有时为什么会提示某个DLL文件不存在?Windows程序在运行时需要加载其配套的动态连接库DLL文件,当其没有被搜索到时就会提示不存在。(4)ADDR与OFFSET有何不同?都是地址操作符,后接标号或变量名表示它们的地址。但是addr只用在invoke语句中,获取局部变量的地址。 Offset只能获取全

2、局变量的偏移地址。(5)ExitProcess函数可以按汇编语言习惯全部使用小写字母表示吗?不能,因为Windows的API函数按照C语言习惯区别大小写字母,是不同的(6)Win32 API中可以使用哪两种字符集?8位的ASCII字符集和16位的Unicode字符集(7)为什么调用API函数之后,ECX等寄存器改变了?因为API函数并不是按照汇编语言的规则编写的,它的规则是不保护它们(8)条件控制“.IF”伪指令的条件是在汇编阶段进行判断吗?不是。条件控制伪指令在会变阶段要转换为一组功能相当等比较、测试喝转移指令,是在执行阶段进行判断的。(9)为什么32位api函数的地址指针也可以转换为汇编语

3、言的双字类型?32位api函数的地址指针与汇编语言的双字类型DWORD相对应(10)在masm32软件包支持下的汇编语言程序中为什么没有看到对windows常量、函数等的定义和声明?对windows常量、函数等的定义和声明已经包含在windows.inc、kerne;32.inc及user32.inc等文件中。6.2 判断题(1)Windows可执行文件中包含动态连接库中的代码。错,不含,运行时才加载(2)导入库文件和静态子程序库文件的扩展名都是.lib,所以两者性质相同。错,导入库中记录的是动态连接库中函数等的名称及存储位置等信息,不含执行代码。(3)INVOKE语句只能传递主存操作数,不能

4、传递寄存器值。错,可以使用寄存器参数(4)Windows控制台是命令行窗口,也就是MS-DOS窗口。错,Windows控制台与DOS窗口本质不同(5)与高级语言类似,汇编语言中使用结构变量也需要先说明结构类型对(6)proc伪指令可以使用uses操作符,但是proto伪指令不可以使用。对(7)在宏定义中,local伪指令声明标识符;而在过程定义中,local伪指令用于分配局部变量。对(8)条件汇编IF和条件控制.IF伪指令都包括条件表达式,它们的表达形式一样。对(9)条件控制.IF伪指令和循环控制伪指令.WHILE中的条件表达式具有相同的表达形式。对(10)masm32软件包只支持32位图形界

5、面应用程序的开发,不支持控制台应用程序的开发。错。6.3 填空题(1)Windows系统有3个最重要的系统动态连接库文件,它们是_、_和_。KERNEL32.DLL,USER32.DLL,GDI32.DLL(2)进行windows应用程序开发时,需要( )库文件;执行该应用程序时,则需要对应的( )库文件。导入库,动态链接库(3)获得句柄函数GetStdHandle执行结束,使用_提供返回结果。EAX(4)函数GetStdHandle需要一个参数,对标准输入设备应该填入( )数值,对标准输出设备应该填入 ( )数值,对边准错误输出设备应该填入( )数值-10,-11,-12(5)调用ReadC

6、onsole函数时,用户在键盘上按下数字8,然后回车,则键盘缓冲区的内容一次是( )。38h,0dh,0ah(6)WriteConsole和ReadConsole函数的参数类似,都有5个,第1个参数是_,第2个参数是输出或输入缓冲区的_,第3个参数是输出或输入的字符_,第4个参数指向实际输出或输入字符个数的变量,最后1个参数一般要求代入_。句柄实例,地址,个数,0(7)消息窗口函数MessageBox有4个参数,第1个是0,第2个是要显示字符串的(),第3个是()的地址指针,第4个参数指明窗口形式。注意字符串要使用()作为结尾标志。地址指针(即首地址),窗口标题,0(8)要使用获取系统日期时间

7、函数GetLocalTime,需要定义一个()结构变量,其中返回系统时间数值,这些数值采用2进制编码,例如,日期返回的编码是0019h,它表示日期是()。SYSTEMTILE,25(9)使用扩展的proc伪指令编写子程序比较方便,例如,子程序中需要保护和恢复esi和edi寄存器,就只需要使用()既可以。Uses esi edi(10)masm进行汇编时生成最大化源代码列表,其中语句前使用字母()表示是通过包含文件插入的语句,使用“*”符号的语句是()的代码,而语句前的数字则说明是()语句。C,汇编程序生成,宏调用习题6.4执行CPUID指令,直接使用控制台输出函数将处理器识别字符串显示出来。

8、.686 .model flat,stdcall option casemap:none includelib binkernel32.lib ExitProcess proto,:dwordGetStdHandle proto,:dword WriteConsoleA proto,:dword,:dword,:dword,:dword,:dword WriteConsole equ STD_OUTPUT_HANDLE = -11 .dataouthandle dword ?outbuffer byte The processor , 12 dup(0)outbufsize = sizeof

9、outbuffer outsize dword ?.codemov 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 o

10、utsize,0 invoke ExitProcess,0 习题6.5直接使用控制台输入和输出函数实现例6-2的功能(不使用readmsg,dispmsg).注意,输入和输出句柄只要各获取一个既可。 .686 .model flat,stdcall option casemap:none includelib binkernel32.libExitProcess proto,:dwordexit macro dwexitcode invoke ExitProcess,dwexitcode endmGetStdHandle proto,:dwordWriteConsoleA proto,:dwo

11、rd,:dword,:dword,:dword,:dwordWriteConsole equ ReadConsoleA proto,:dword,:dword,:dword,:dword,:dwordReadConsole equ STD_INPUT_HANDLE = -10STD_OUTPUT_HANDLE = -11 .datamsg1 byte Please enter your name: ,0msg2 byte Welcome ,0nbuf byte 80 dup(0)msg3 byte to Win32 Console!,0_outhandle dword ?_inhandle d

12、word ?_insize dword ?_outsize dword ? .codestart: invoke GetStdHandle,STD_OUTPUT_HANDLE mov _outhandle,eax invoke GetStdHandle,STD_INPUT_HANDLE mov _inhandle,eax invoke WriteConsole,_outhandle,addr msg1,sizeof msg1,addr _outsize,0 invoke ReadConsole,_inhandle,addr nbuf,80,addr _insize, 0 invoke Writ

13、eConsole,_outhandle,addr msg2,sizeof msg2,addr _outsize,0 sub _insize,2 invoke WriteConsole,_outhandle,addr nbuf,_insize,addr _outsize,0 invoke WriteConsole,_outhandle,addr msg3,sizeof msg3,addr _outsize,0 exit 0 end start习题6.6直接使用控制台输出函数实现某个主存区域内容的显示。要求改进显示形式,例如,每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然

14、后用冒号分隔主存内容。.datavar byte This is a test!,ABCDEFG,0123456789_outsize dword ?_outhandle dword ?_membuffer byte 57 dup(20h),13,10 .codestart: mov eax,offset var mov ecx,sizeof var call dispmem invoke ExitProcess,0dispmem proc test ecx,ecx ;个数为0,不显示 jz dispm11 ;退出 pushad mov esi,ecx ;ESI=要显示内容的字节数 mov e

15、di,eax ;EDI=要显示内容的地址 invoke GetStdHandle,STD_OUTPUT_HANDLE mov _outhandle,eax ;获得输出句柄;1.显示缓冲区全部填充为空格dispm1: xor ebx,ebx ;指示显示缓冲区dispm2: mov _membufferebx, inc ebx cmp ebx,(sizeof _membuffer)-2 jb dispm2 ;2.显示内容所在的存储器地址 xor ebx,ebx mov ecx,8 ;地址是十六进制8位 mov eax,edidispm3: rol eax,4 mov dl,al and dl,0f

16、h or dl,30h cmp dl,39h jbe dispm4 add dl,7dispm4: mov _membufferebx,dl inc ebx loop dispm3 mov _membufferebx,: ;显示冒号 add ebx,2mov ecx,16 ;一行最多显示16个字节 ;3.显示一个字节内容dispm5: mov al,edi mov dl,al shr dl,4 or dl,30h cmp dl,39h jbe dispm6 add dl,7dispm6: mov _membufferebx,dl inc ebxand al,0fh or al,30h cmp

17、al,39h jbe dispm7 add al,7dispm7: mov _membufferebx,al add ebx,2 inc edi ;指向下一个要显示的字节 dec esi jz dispm10 ;没有要显示的内容,退出 loop dispm5invoke WriteConsole,_outhandle, addr _membuffer,sizeof _membuffer, addr _outsize,0 jmp dispm1dispm10: invoke WriteConsole,_outhandle, addr _membuffer,sizeof _membuffer, ad

18、dr _outsize,0 popad dispm11: retdispmem endp习题6.7执行CPUID指令,在消息窗口显示处理器识别字符串,要求该消息窗有OK和Cancel两个按钮。MessageBoxA proto :dword,:dword,:dword,:dwordMessageBox equ NULL equ 0MB_OK equ 1 .dataszCaption byte 消息窗口,0outbuffer byte 本机的处理器是, 12 dup(0),0outbufsize = sizeof outbuffer-1.codestart: mov eax,0 cpuid ;执

19、行处理器识别指令 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 op

20、tion casemap:none includelib .libkernel32.lib includelib .libuser32.libExitProcess proto,:dwordexit macro dwexitcode invoke ExitProcess,dwexitcode endmGetStdHandle proto,:dwordWriteConsoleA proto,:dword,:dword,:dword,:dword,:dwordWriteConsole equ MessageBoxA proto,:dword,:dword,:dword,:dwordMessageB

21、ox equ STD_INPUT_HANDLE = -10STD_OUTPUT_HANDLE = -11 ;宏定义dreg32 macro reg32 local dreg1,dreg2 mov eax,reg32 ;显示reg32寄存器 mov ecx,8 xor ebx,ebxdreg1: rol eax,4 mov edx,eax and dl,0fh add dl,30h ;转化为相应的ASCII码值 cmp dl,39h ;区别09和AF数码 jbe dreg2 add dl,7dreg2: mov rd®32&ebx+4,dl inc ebx cmp ebx,ecx jb d

22、reg1 endm .datastrCaption byte 32位通用寄存器内容,0rdeax byte EAX=00000000, rdebx byte EBX=00000000, rdecx byte ECX=00000000, rdedx byte EDX=00000000,13,10rdesi byte ESI=00000000, rdedi byte EDI=00000000, rdebp byte EBP=00000000, rdesp byte ESP=00000000,13,10,0_outsize dword $ - rdeax _outhandle dword ? .co

23、destart: 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 0dprd proc pushad push edx push ecx push ebx dreg32 eax ;显示EAX pop ebx dreg32 ebx ;显示EBX pop ecx dreg3

24、2 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利用获得系统时间函数,将年月日时分秒星期等时间完整地显示出来。可以创建一个控制台程序,也

25、可以创建一个消息窗口程序。习题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,5Jne doneCmp eax,ebxJe doneI

26、nc eaxDone:(2) Cmp var,5Je l1Cmp eax,ebxJe doneL1:Dec ebxDone:习题6.12对于如下两个程序段:(1)WHILE循环结构.while eax !=10Mov ebx*4,eaxInc eax.endw(2)UNTIL循环结构.repeatMov ebx*4,eaxInc eax.until eax =10请直接使用处理器指令实现上述分支结构,并比较汇编程序生成的代码序列。答:(1)Next:Cmp eax,10Je doneMov ebx*4,eaxInc eaxJmp nextdone:(2)Next: Mov ebx*4,eaxI

27、nc eaxCmp eax,10Jne 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)

28、.if (stringebx=20h) inc eax .endif inc ebx dec ecx .endw习题6.15调用GetCommandLine函数,可以从eax返回指向命令行输入字符串(包含路径、文件名和参数)。要求编程利用MessageBox函数输出这个字符串。 .686 .model flat,stdcall option casemap:none includelib .libkernel32.lib includelib .libuser32.libExitProcess proto,:dwordMessageBoxA proto :dword,:dword,:dword

29、,:dwordMessageBox equ NULL equ 0MB_OK equ 0GetCommandLineA proto GetCommandLine equ .data ; 数据定义szCaption byte 命令行内容 .codestart: ; 主程序 invoke GetCommandLine invoke MessageBox,0,eax,addr szCaption,MB_OK invoke ExitProcess,0 ; 子程序 end start习题6.16在windows窗口应用程序中例6-11的基础上,增加单击鼠标右键弹出另一个消息窗口的功能,在masm32开发环境生成可执行文件。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2