微机系统原理与接口第15章

上传人:沈*** 文档编号:244032643 上传时间:2024-10-02 格式:PPT 页数:33 大小:249KB
返回 下载 相关 举报
微机系统原理与接口第15章_第1页
第1页 / 共33页
微机系统原理与接口第15章_第2页
第2页 / 共33页
微机系统原理与接口第15章_第3页
第3页 / 共33页
点击查看更多>>
资源描述
微型计算机原理与接口技术,第,15,章,Windows,汇编语言编程初步,15.1 Windows,基础,15.2,Win32,汇编源程序的格式,15.3 Win32,汇编可执行文件的生成,15.4 Win32,汇编基本语法,15.5,创建,Windows,下的窗口程序,15.1 Windows,基础,1. Windows,的内存管理,Windows,操作系统为每一个应用程序建立一个,4GB,的,线性空间。线性空间中只包含该应用程序的数据段和代码段,,操作系统使用的代码和数据(如全局描述符表,GDT,,,局部描述符表,LDT,与页表等)以及一些共享代码和数据等。,2,Win32,汇编的内存寻址,与实模式的汇编相比,,Win32,汇编对内存数据的访问更加方便。,(,2,),Windows,操作系统不仅已经预先为要运行的用户应用程序的代码段、数据段和堆栈段设置好描述符,规定这些段的的段基址都为,0,,段界限都为,FFFFFFFFH,。而且程序开始执行时,,CS,,,DS,,,ES,,,SS,里存放的选择子已经指向正确的描述符,,程序员不需要给这些段寄存器赋值。在整个程序运行期间,程序员也不应该修改这些段寄存器的值。,(,1,),在,Windows,系统中,每个应用程序的整个,4GB,线性地址空间都作为一个段。,代码段和数据段,/,堆栈段的空间统一的,都是,00000000HFFFFFFFFH,。在这个,4GB,的地址空间中,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,另外还有一部分被系统使用。这些部分的地址区域是不重合的。,3,Windows,下的中断和异常,(,1,)为了系统的安全,运行在特权级,3,的应用程序是不能像工作在实模式下一样,自己来编写中断服务子程序,也不能通过修改中断描述符表来调用系统提供的中断服务子程序。,(,2,)在,Windows,操作系统中,使用,Windows,提供的应用程序编程接口,(API),来代替中断服务子程序提供的系统功能,4,Windows,系统下的,I/O,保护,应用程序执行时,对端口是不能直接进行访问的,也不能使用,STI,,,CLI,中断允许和禁止指令。,15.2,Win32,汇编源程序的格式,15.2.1,源程序结构,.586 .MODEL FLAT, STDCALL,.OPTION CASEMAP:NONE .DATA .DATA? .CONST .CODE . END ,1.,方式选择伪指令,.586,是一个汇编语言伪指令,含义和,DOS,汇编相同,.,2,内存模式选择伪指令,.MODEL,是用来指定内存模式的伪指令。,.MODEL FLAT,汇编程序自动为各种段寄存器做如下段约定:,ASSUME CS:FLAT,DS:FLAT,SS:FLAT,ES:FLAT,STDCALL,告诉汇编程序参数的传递约定。,Win32,汇编语言采用,STDCALL,格式。,STDCALL,格式参数传递顺序是从右到左,即最右边的参数最先压栈,由被调用者(子程序)恢复堆栈指针。,3.OPTION,语句,OPTION CASEMAP:TYPE,说明程序中的变量和子程序名是否对大小写敏感,即区分大小写。由于,Windows API,函数是区分大小写,选项应设置为“,OPTION CASEMAP:NONE”,。,4,段定义伪指令,WIN32,中只包含代码段和数据段:,DATA,和,CODE,其中数据段又分为三种,.DATA .DATA? .CONST,.DATA,定义已初始化的变量。这些变量的值在程序的执行中可以被更改。,.DATA?,定义未初始化的变量。,.CONST,定义常量,这些常量在程序运行过程中是不能更改的,.CODE,定义代码段。,格式:,END,标号,功能:通知汇编程序,源程序到此结束,标号所对应的指令是程序的启动指令。,5,汇编结束语句,Win32,汇编语言经典源程序例子,.586,.MODEL FLAT,STDCALL,OPTION CASEMAP:NONE,INCLUDE WINDOWS.INC,INCLUDE KERNEL32.INC,INCLUDELIB KERNEL32.LIB,INCLUDE USER32.INC,INCLUDELIB USER32.LIB,.DATA,MsgBoxCaption,DB Example of win32,0 ;,消息框标题显示字符串,MsgBoxText,DB Hello,,,你好!,0 ;,消息框内显示字符串,.CODE,START:,INVOKE,MessageBox, NULL,addr,MsgBoxText,addr,MsgBoxCaption, MB_OK,INVOKE,ExitProcess, NULL,END START,15.3 Win32,汇编可执行文件的生成,汇编源程序,*,.,asm,资源脚本文件,*,.,rc,汇编程序,资源编译程序,目标程序,*,.,obj,资源文件,*,.,res,链接,程序,Win32,可执行文件,*,.exe,Win32,汇编软件的开发可分源程序开发和资源开发两部分,汇编链接步骤,(,以教材例,15.1,为例,),(,1,)汇编源程序,hello.asm,ml /c /,coff,hello.asm,(,2,)链接目标程序,hello.obj,link /,subsystem:windows,hello.obj,(,3,)运行可执行程序,hello.exe,hello.exe,注意:如果该程序有资源文件,hello.res,,则应该用,link,将,hello.obj,和,hello.res,链接成,hello.exe,。,15.4 Win32,汇编基本语法,15.4.1,标号和变量,Win32,汇编使用的高版本汇编中,,标号的作用域是当前的子程序。,在同一个子程序中的标号不能同名,但在不同的子程序中可以有相同名称的标号。,1.,标号,Win32,汇编中变量的类型很多,根据变量的作用域可分为全局变量和局部变量。,(,1,)全局变量,用数据定义伪指令在,.DATA,或,.DATA?,段定义全局变量。全局变量的作用域是整个程序。,2,变量,(,2,)局部变量,例:,LOCAL VAR1:WORD,LOCAL VAR2,LOCAL VAR310:BYTE,注意:,LOCAL,伪指令必须紧跟在子程序定伪指令,PROC,之后,其它指令之前。局部变量不能和全局变量同名。,局部变量的作用域是当前的子程序。,定义格式:,LOCAL,变量,1,重复数量,1,:类型,,,变量,2,重复数量,2,:类型,3.,获取变量地址,获取全局变量地址使用,OFFSET,运算符。,例:,MOVBX,OFFSET,变量名,注意:,ADDR,伪操作符只能在,INVOKE,的参数中使用。,对于局部变量,,MASM,对此有一个专用的伪操作符,ADDR,。,格式:,ADDR,局部变量名和全局变量名,例:,INVOKE,MessageBox, NULL, ADDR,MsgBoxText, ADDR,MsgBoxCaption, MB_OK,15.4.2,结构,1,结构的定义,格式:结构名,STRUCT,字段,1,类型,?,字段,2,类型,?,结构名,ENDS,例:定义一个名为,STUDENT,的结构,该结构有,3,个字段。,STUDENT STRUCT,NUM BYTE ?,SEX BYTE ?,RECORD WORD,?,STUDENT ENDS,2,结构变量的定义,结构变量的定义格式如下:,变量名 结构名,格式一,或,变量名 结构名,格式二,例:定义结构变量,STU1 STUDENT ,STU2 STUDENT,3,结构变量的访问,在汇编中,结构变量的访问的两种较简单的方法:,(,1,),MOV AX,STU2.RECORD,表示把,RECORD,字段的值放入,AX,中去。,(,2,),MOV ESI,OFFSET STU2,使用指针存取数据结构,15.4.3,子程序,格式:,子程序名,PROC ,语言类型,可视区域,USES,寄存器列表,参数,:,类型,.VARARG,LOCAL,局部变量列表,RET,子程序名,ENDP,(1),语言类型,表示参数的使用方式和堆栈平衡的方式,,Win32,约定的类型是,STDCALL,。,参数传递顺序是从右到左,由子程序恢复堆栈指针。,(2),可视区域,PRIVATE,表示子程序只对本模块可见;,PUBLIC,表示对所有的模块可见;,EXPORT,表示是导出的函数。默认的设置是,PUBLIC,。,(3)USES,寄存器列表,表示,CPU,在进入子程序后自动执行,PUSH,这些寄存器的指令,在,RET,子程序返回前自动执行,POP,指令,用于保护现场。,(4),参数和类型,参数指参数的名称,在定义参数名的时候不能跟全局变量和子程序中的局部变量重名。对于类型,由于,Win32,中的参数类型只有,32,位(,DWORD,),一种类型,所以可以省略。,(5)VARARG,表示在已确定的参数后还可以跟多个数量不确定的参数。,完成了子程序定义之后,可以用,CALL,指令或更方便的,INVOKE,伪指令来调用子程序。,例:利用子程序完成三数相加,N1+N2+N3,,,假设,N1=1122H,N2=3344H,N3=5566H,.586,.MODEL FLAT,STDCALL,OPTION CASEMAP:NONE,INCLUDE KERNEL32.INC,INCLUDELIB KERNEL32.LIB,INCLUDE WINDOWS.INC,COMPUTE PROTO PARA1:DWORD ;,计算子程序声明,.DATA,N1 DW 1122H,N2 DW 3344H,N3 DW 5566H,.DATA?,SUM DW ? ;,计算结果,.CODE,START:,;,调用计算子程序,将数据存放的起始地址作为传递的参数,INVOKE COMPUTE,ADDR N1,MOV SUM,AX ;,保存计算结果,INVOKE,ExitProcess, NULL ;,结束执行程序,COMPUTE PROC USES EAX EBX,PARA1:DWORD,MOV EBX,PARA1,MOV EAX,0 ;,求和寄存器清,0,MOV AX,WORD PTR EBX ;AX=N1,ADD AX, WORD PTR EBX+2 ;AX=N1+N2,ADD AX, WORD PTR EBX+4 ;AX=N1+N2+N3,RET,COMPUTE ENDP,END START,15.4.4,高级语法,Win32,的高版本,MASM,中新引入了一系列的伪指令,涉及条件测试、分支和循环语句。利用它们,汇编语言有了和高级语言一样的结构,配合局部变量和调用参数,为使用,Win32,汇编编写大规模的,Windows,应用程序奠定了基础。,1,条件测试表达式,在所有的分支和循环语句首先要进行条件测试。,条件测试,表达式,:,寄存器或变量操作符 操作数,两个以上的表达式可以用逻辑运算符连接,CPU,标志寄存器一些标志位的状态,相当于一个表达式。,允许的操作符、逻辑运算符和,标志位状态见教材,表,15.4,。,例:,X=10,;,X,等于,10,为真,EAX!=0,;,EAX,不等于,0,为真,SBYTE PTR AL=8,;,AL,大于等于,8,时为真,,AL,为有符号数,(X=100)&ECX,;,X,大于等于,100,且,ECX,为非零时为真,(EAX= =EBX) & ZERO?,;,EAX,等于,EBX,且,Z,标志,=1,为真,分支语句的语法如下:,.IF,条件表达式,1,表达式,1,为“真”时执行的指令,.ELSEIF,条件表达式,2,表达式,2,为“真”时执行的指令,.ELSEIF,条件表达式,3,表达式,3,为“真”时执行的指令,.ELSE,所有表达式为“否”时执行的指令,.ENDIF,2,分支语句,注意:关键字,IF/ELSEIF/ELSE/ENDIF,的前面有个小数点。,例:,设,NUMBER,单元的数,X,以及数值,N1,N2,均为单字节无符号数,请判断,X,的大小,并根据判断结果分别显示:,N1=X=N2,或,XN2,【,例,15.4.2】,.586,.MODEL FLAT,STDCALL,OPTION CASEMAP:NONE,INCLUDE KERNEL32.INC,INCLUDE WINDOWS.INC,INCLUDELIB KERNEL32.LIB,INCLUDE USER32.INC,INCLUDELIB USER32.LIB,.DATA,N1 DB 22,N2 DB 88,MESG1 DB N1=X=N2,0,MESG2 DB XN2,0,MsgBoxCaption,DB EXAMPLE OF WIN32,0,.DATA?,NUMBER DB ?,.CODE,START:,MOV AL,NUMBER,.IF(AL=N1 N1=X=N2,MOV EBX,OFFSET MESG1,.ELSEIF(ALN1) ;XN2,MOV EBX,OFFSET MESG3,.ENDIF,INVOKE,MessageBox, NULL, EBX, ADDR,MsgBoxCaption, MB_OK,INVOKE,ExitProcess, NULL,END START,3,循环语句,(,1,)循环结构语法一,.WHILE,条件测试表达式,指令,.BREAK .IF,退出条件,.CONTINUE,.ENDW,(,2,)循环结构语法二,.REPEAT,指令,.BREAK .IF,退出条件,.CONTINUE,.UNTIL,条件测试表达式 (或,.UNTILCXZ ,条件测试表达式,),例:假设从,BUF,单元开始为一个,ASCII,码字符串,找出其中的最大数送屏幕显示。,【,例,15.4.3】,.586,.MODEL FLAT,STDCALL,OPTION CASEMAP:NONE,INCLUDE KERNEL32.INC,INCLUDE WINDOWS.INC,INCLUDELIB KERNEL32.LIB,INCLUDE USER32.INC,INCLUDELIB USER32.LIB,.DATA,BUF DB QWERYTUIOP123,COUNT EQU $-BUF,MAX DB Max=,?,0,MsgBoxCaption,DB Example of win32,0,.CODE,START,:,MOV ECX,0,MOV EBX,OFFSET BUF ;,字符串首址偏移,-EBX,MOV AL,0 ;,最小数,-AL,.WHILE ECXAL) ;,比较,MOV AL,DL ;,大数,-AL,.ENDIF,INC EBX ;,调整字符串首址偏移,INC ECX,.ENDW,MOV MAX+4,AL ;,保存最大值,INVOKE,MessageBox, NULL, ADDR MAX, ADDR,MsgBoxCaption, MB_OK,INVOKE,ExitProcess, NULL,END START,15.5,创建,Windows,下的窗口程序,窗口程序的运行过程,应用程序,A,消息队列,应用程序,A,消息循环过程,GetMessage,(),TranslateMessage,(),DispatchMessage,(),窗口过程,ret,系统消息队列,所有消息,各种用户操作,其它应用程序,消息队列,传递消息,回调窗口过程,返回,15.5.2,窗口程序示例,在,Windows,操作系统下创建并显示一个窗口程序的编程步骤为:,(,1,)调用,GetModuleHandle,函数获得应用程序的句柄。,(,2,)可以根据需要从命令行得到参数。,(,3,)如果不是使用,Windows,预定义的窗口类,如,MessageBox,或,dialog box,,必须先填写用户自定义窗口注册类的结构(,WNDCLASSEX,的)变量参数,再调用,RegisterClassEx,函数注册窗口类。,(,4),调用,ShowWindow,函数显示窗口。,(,5,)调用,UpdateWindows,函数刷新窗口客户区。,(,6,)进入消息循环。,(,7,)如果有消息到达,则由该窗口的窗口回调函数,即用户写的窗口过程,对消息进行处理。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!