Windows编程
- 格式:doc
- 大小:37.50 KB
- 文档页数:11
第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,stdcalloption casemap:noneincludelib bin\kernel32.libExitProcess proto,:dwordGetStdHandle proto,:dwordWriteConsoleA\proto,:dword,:dword,:dword,:dword,:dwordWriteConsole equ <WriteConsoleA>STD_OUTPUT_HANDLE = -11.dataouthandle dword ?outbuffer byte 'The processor ……', 12 dup(0)outbufsize = sizeof outbufferoutsize dword ?.codemov eax,0cpuid ;执行处理器识别指令mov dword ptr outbuffer+outbufsize-12,ebxmov dword ptr outbuffer+outbufsize-8,edxmov dword ptr outbuffer+outbufsize-4,ecxinvoke GetStdHandle,STD_OUTPUT_HANDLEmov outhandle,eaxinvoke WriteConsole,outhandle,\addr outbuffer,outbufsize,addr outsize,0invoke ExitProcess,0习题6.5直接使用控制台输入和输出函数实现例6-2的功能(不使用readmsg,dispmsg).注意,输入和输出句柄只要各获取一个既可。
.686.model flat,stdcalloption casemap:noneincludelib bin\kernel32.libExitProcess proto,:dwordexit macro dwexitcodeinvoke ExitProcess,dwexitcodeendmGetStdHandle proto,:dwordWriteConsoleA proto,:dword,:dword,:dword,:dword,:dwordWriteConsole equ <WriteConsoleA>ReadConsoleA proto,:dword,:dword,:dword,:dword,:dwordReadConsole equ <ReadConsoleA>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 dword ?_insize dword ?_outsize dword ?.codestart:invoke GetStdHandle,STD_OUTPUT_HANDLEmov _outhandle,eaxinvoke GetStdHandle,STD_INPUT_HANDLEmov _inhandle,eaxinvoke WriteConsole,_outhandle,addr msg1,sizeof msg1,addr _outsize,0invoke ReadConsole,_inhandle,addr nbuf,80,addr _insize, 0invoke WriteConsole,_outhandle,addr msg2,sizeof msg2,addr _outsize,0sub _insize,2invoke WriteConsole,_outhandle,addr nbuf,_insize,addr _outsize,0invoke WriteConsole,_outhandle,addr msg3,sizeof msg3,addr _outsize,0exit 0end start习题6.6直接使用控制台输出函数实现某个主存区域内容的显示。
要求改进显示形式,例如,每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。
.datavar_outsize dword ?_outhandle dword ?_membuffer byte 57 dup(20h),13,10.codestart: mov eax,offset varmov ecx,sizeof varcall dispmeminvoke ExitProcess,0dispmem proctest ecx,ecx ;个数为0,不显示jz dispm11 ;退出pushadmov 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 ebxcmp ebx,(sizeof _membuffer)-2jb dispm2;2.显示内容所在的存储器地址xor ebx,ebxmov ecx,8 ;地址是十六进制8位mov eax,edidispm3: rol eax,4mov dl,aland dl,0fhor dl,30hcmp dl,39hjbe dispm4add dl,7dispm4: mov _membuffer[ebx],dlinc ebxloop dispm3mov _membuffer[ebx],':' ;显示冒号add ebx,2mov ecx,16 ;一行最多显示16个字节;3.显示一个字节内容dispm5: mov al,[edi]mov dl,alshr dl,4or dl,30hcmp dl,39hjbe dispm6add dl,7dispm6: mov _membuffer[ebx],dlinc ebxand al,0fhor al,30hcmp al,39hjbe dispm7add al,7dispm7: mov _membuffer[ebx],aladd ebx,2inc edi ;指向下一个要显示的字节dec esijz dispm10 ;没有要显示的内容,退出loop dispm5invoke WriteConsole,_outhandle,\addr _membuffer,sizeof _membuffer,\addr _outsize,0jmp dispm1dispm10: invoke WriteConsole,_outhandle,\addr _membuffer,sizeof _membuffer,\addr _outsize,0popaddispm11: retdispmem endp习题6.7执行CPUID指令,在消息窗口显示处理器识别字符串,要求该消息窗有OK和Cancel两个按钮。