第章windows编程.docx

上传人:b****8 文档编号:9773553 上传时间:2023-05-21 格式:DOCX 页数:18 大小:20.65KB
下载 相关 举报
第章windows编程.docx_第1页
第1页 / 共18页
第章windows编程.docx_第2页
第2页 / 共18页
第章windows编程.docx_第3页
第3页 / 共18页
第章windows编程.docx_第4页
第4页 / 共18页
第章windows编程.docx_第5页
第5页 / 共18页
第章windows编程.docx_第6页
第6页 / 共18页
第章windows编程.docx_第7页
第7页 / 共18页
第章windows编程.docx_第8页
第8页 / 共18页
第章windows编程.docx_第9页
第9页 / 共18页
第章windows编程.docx_第10页
第10页 / 共18页
第章windows编程.docx_第11页
第11页 / 共18页
第章windows编程.docx_第12页
第12页 / 共18页
第章windows编程.docx_第13页
第13页 / 共18页
第章windows编程.docx_第14页
第14页 / 共18页
第章windows编程.docx_第15页
第15页 / 共18页
第章windows编程.docx_第16页
第16页 / 共18页
第章windows编程.docx_第17页
第17页 / 共18页
第章windows编程.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第章windows编程.docx

《第章windows编程.docx》由会员分享,可在线阅读,更多相关《第章windows编程.docx(18页珍藏版)》请在冰点文库上搜索。

第章windows编程.docx

第章windows编程

第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)Win32API中可以使用哪两种字符集?

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寄存器,就只需要使用()既可以。

Usesesiedi

(10)masm进行汇编时生成最大化源代码列表,其中语句前使用字母()表示是通过包含文件插入的语句,使用“*”符号的语句是()的代码,而语句前的数字则说明是()语句。

C,汇编程序生成,宏调用

习题6.4

执行CPUID指令,直接使用控制台输出函数将处理器识别字符串显示出来。

.686

.modelflat,stdcall

optioncasemap:

none

includelibbin\kernel32.lib

ExitProcessproto,:

dword

GetStdHandleproto,:

dword

WriteConsoleA\

proto,:

dword,:

dword,:

dword,:

dword,:

dword

WriteConsoleequ

STD_OUTPUT_HANDLE=-11

.data

outhandledword

outbufferbyte'Theprocessor……',12dup(0)

outbufsize=sizeofoutbuffer

outsizedword

.code

moveax,0

cpuid;执行处理器识别指令

movdwordptroutbuffer+outbufsize-12,ebx

movdwordptroutbuffer+outbufsize-8,edx

movdwordptroutbuffer+outbufsize-4,ecx

invokeGetStdHandle,STD_OUTPUT_HANDLE

movouthandle,eax

invokeWriteConsole,outhandle,\

addroutbuffer,outbufsize,addroutsize,0

invokeExitProcess,0

习题6.5

直接使用控制台输入和输出函数实现例6-2的功能(不使用readmsg,dispmsg).注意,输入和输出句柄只要各获取一个既可。

.686

.modelflat,stdcall

optioncasemap:

none

includelibbin\kernel32.lib

ExitProcessproto,:

dword

exitmacrodwexitcode

invokeExitProcess,dwexitcode

endm

GetStdHandleproto,:

dword

WriteConsoleAproto,:

dword,:

dword,:

dword,:

dword,:

dword

WriteConsoleequ

ReadConsoleAproto,:

dword,:

dword,:

dword,:

dword,:

dword

ReadConsoleequ

STD_INPUT_HANDLE=-10

STD_OUTPUT_HANDLE=-11

.data

msg1byte'Pleaseenteryourname:

',0

msg2byte'Welcome',0

nbufbyte80dup(0)

msg3byte'toWin32Console!

',0

_outhandledword

_inhandledword

_insizedword

_outsizedword

.code

start:

invokeGetStdHandle,STD_OUTPUT_HANDLE

mov_outhandle,eax

invokeGetStdHandle,STD_INPUT_HANDLE

mov_inhandle,eax

invokeWriteConsole,_outhandle,addrmsg1,sizeofmsg1,addr_outsize,0

invokeReadConsole,_inhandle,addrnbuf,80,addr_insize,0

invokeWriteConsole,_outhandle,addrmsg2,sizeofmsg2,addr_outsize,0

sub_insize,2

invokeWriteConsole,_outhandle,addrnbuf,_insize,addr_outsize,0

invokeWriteConsole,_outhandle,addrmsg3,sizeofmsg3,addr_outsize,0

exit0

endstart

习题6.6

直接使用控制台输出函数实现某个主存区域内容的显示。

要求改进显示形式,例如,每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。

.data

_outsizedword

_outhandledword

_membufferbyte57dup(20h),13,10

.code

start:

moveax,offsetvar

movecx,sizeofvar

calldispmem

invokeExitProcess,0

dispmemproc

testecx,ecx;个数为0,不显示

jzdispm11;退出

pushad

movesi,ecx;ESI=要显示内容的字节数

movedi,eax;EDI=要显示内容的地址

invokeGetStdHandle,STD_OUTPUT_HANDLE

mov_outhandle,eax;获得输出句柄

;1.显示缓冲区全部填充为空格

dispm1:

xorebx,ebx;指示显示缓冲区

dispm2:

mov_membuffer[ebx],''

incebx

cmpebx,(sizeof_membuffer)-2

jbdispm2

;2.显示内容所在的存储器地址

xorebx,ebx

movecx,8;地址是十六进制8位

moveax,edi

dispm3:

roleax,4

movdl,al

anddl,0fh

ordl,30h

cmpdl,39h

jbedispm4

adddl,7

dispm4:

mov_membuffer[ebx],dl

incebx

loopdispm3

mov_membuffer[ebx],':

';显示冒号

addebx,2

movecx,16;一行最多显示16个字节

;3.显示一个字节内容

dispm5:

moval,[edi]

movdl,al

shrdl,4

ordl,30h

cmpdl,39h

jbedispm6

adddl,7

dispm6:

mov_membuffer[ebx],dl

incebx

andal,0fh

oral,30h

cmpal,39h

jbedispm7

addal,7

dispm7:

mov_membuffer[ebx],al

addebx,2

incedi;指向下一个要显示的字节

decesi

jzdispm10;没有要显示的内容,退出

loopdispm5

invokeWriteConsole,_outhandle,\

addr_membuffer,sizeof_membuffer,\

addr_outsize,0

jmpdispm1

dispm10:

invokeWriteConsole,_outhandle,\

addr_membuffer,sizeof_membuffer,\

addr_outsize,0

popad

dispm11:

ret

dispmemendp

习题6.7

执行CPUID指令,在消息窗口显示处理器识别字符串,要求该消息窗有OK和Cancel两个按钮。

MessageBoxAproto:

dword,:

dword,:

dword,:

dword

MessageBoxequ

NULLequ0

MB_OKequ1

.data

szCaptionbyte'消息窗口',0

outbufferbyte'本机的处理器是',12dup(0),0

outbufsize=sizeofoutbuffer-1

.code

start:

moveax,0

cpuid;执行处理器识别指令

movdwordptroutbuffer+outbufsize-12,ebx

movdwordptroutbuffer+outbufsize-8,edx

movdwordptroutbuffer+outbufsize-4,ecx

invokeMessageBox,NULL,addroutbuffer,\

addrszCaption,MB_OK

invokeExitProcess,NULL

endstart

习题6.8

参考5-10,利用MessageBox函数创建的消息窗口显示32位通用寄存器内容。

.686

.modelflat,stdcall

optioncasemap:

none

includelib..\lib\kernel32.lib

includelib..\lib\user32.lib

ExitProcessproto,:

dword

exitmacrodwexitcode

invokeExitProcess,dwexitcode

endm

GetStdHandleproto,:

dword

WriteConsoleAproto,:

dword,:

dword,:

dword,:

dword,:

dword

WriteConsoleequ

MessageBoxAproto,:

dword,:

dword,:

dword,:

dword

MessageBoxequ

STD_INPUT_HANDLE=-10

STD_OUTPUT_HANDLE=-11

;宏定义

dreg32macroreg32

localdreg1,dreg2

moveax,reg32;;显示reg32寄存器

movecx,8

xorebx,ebx

dreg1:

roleax,4

movedx,eax

anddl,0fh

adddl,30h;;转化为相应的ASCII码值

cmpdl,39h;;区别0~9和A~F数码

jbedreg2

adddl,7

dreg2:

movrd®32&[ebx+4],dl

incebx

cmpebx,ecx

jbdreg1

endm

.data

strCaptionbyte'32位通用寄存器内容',0

rdeaxbyte'EAX=00000000,'

rdebxbyte'EBX=00000000,'

rdecxbyte'ECX=00000000,'

rdedxbyte'EDX=00000000',13,10

rdesibyte'ESI=00000000,'

rdedibyte'EDI=00000000,'

rdebpbyte'EBP=00000000,'

rdespbyte'ESP=00000000',13,10,0

_outsizedword$-rdeax

_outhandledword

.code

start:

invokeGetStdHandle,STD_OUTPUT_HANDLE

mov_outhandle,eax

movebx,0abcdef00h

movecx,eax

movedx,ebx

movebp,esp

calldprd

exit0

dprdproc

pushad

pushedx

pushecx

pushebx

dreg32eax;显示EAX

popebx

dreg32ebx;显示EBX

popecx

dreg32ecx;显示ECX

popedx

dreg32edx;显示EDX

dreg32esi;显示ESI

dreg32edi;显示EDI

dreg32ebp;显示EBP

addesp,36;获得进入该子程序前的ESP

dreg32esp;显示ESP

subesp,36;恢复ESP

moveax,offsetrdeax

invokeMessageBox,0,eax,addrstrCaption,0

popad

ret

dprdendp

endstart

习题6.9

利用获得系统时间函数,将年月日时分秒星期等时间完整地显示出来。

可以创建一个控制台程序,也可以创建一个消息窗口程序。

习题6.10

结构数据类型如何说明,结构变量如何定义,结构字段如何引用

习题6.11

条件控制伪指令的条件表达式中,逻辑与“&&”表示两者都为真,整个条件才为“真”;逻辑或“||”表示两者之一为真,整个条件就为“真”。

对如下两个程序段(var是一个双字变量):

(1)逻辑与条件

.if(var==5)&&(eax!

=ebx)

Inceax

.endif

(2)逻辑或条件

.if(var==5)||(eax!

=ebx)

Decebx

.endif

请直接使用处理器指令实现上述分支结构,并比较汇编程序生成的代码序列。

答:

(1)

Cmpvar,5

Jnedone

Cmpeax,ebx

Jedone

Inceax

Done:

(2)

Cmpvar,5

Jel1

Cmpeax,ebx

Jedone

L1:

Decebx

Done:

习题6.12

对于如下两个程序段:

(1)WHILE循环结构

.whileeax!

=10

Mov[ebx*4],eax

Inceax

.endw

(2)UNTIL循环结构

.repeat

Mov[ebx*4],eax

Inceax

.untileax==10

请直接使用处理器指令实现上述分支结构,并比较汇编程序生成的代码序列。

答:

(1)

Next:

Cmpeax,10

Jedone

Mov[ebx*4],eax

Inceax

Jmpnext

done:

(2)

Next:

Mov[ebx*4],eax

Inceax

Cmpeax,10

Jnenext

习题6.13

使用条件控制.if伪指令编写习题4.16程序,并生成完整的列表文件

.if!

ZERO

moval,'L'

.else

testdvar,1

.if!

ZERO

moval,'R'

.else

moval,'M';

.endif

.endif

calldispc

习题6.14

使用条件控制.if和循环控制.while伪指令编写习题4.21程序,并生成完整的列表文件

xoreax,eax

xorebx,ebx

movecx,lengthofstring

.while(ecx!

=0)

.if(string[ebx]==20h)

inceax

.endif

incebx

dececx

.endw

习题6.15

调用GetCommandLine函数,可以从eax返回指向命令行输入字符串(包含路径、文件名和参数)。

要求编程利用MessageBox函数输出这个字符串。

.686

.modelflat,stdcall

optioncasemap:

none

includelib..\lib\kernel32.lib

includelib..\lib\user32.lib

ExitProcessproto,:

dword

MessageBoxAproto:

dword,:

dword,:

dword,:

dword

MessageBoxequ

NULLequ0

MB_OKequ0

GetCommandLineAproto

GetCommandLineequ

.data

;数据定义

szCaptionbyte'命令行内容'

.code

start:

;主程序

invokeGetCommandLine

invokeMessageBox,0,eax,addrszCaption,MB_OK

invokeExitProcess,0

;子程序

endstart

习题6.16

在windows窗口应用程序中例6-11的基础上,增加单击鼠标右键弹出另一个消息窗口的功能,在masm32开发环境生成可执行文件。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

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

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