ASM04汇编语言程序格式.ppt

上传人:小飞机 文档编号:5415795 上传时间:2023-07-05 格式:PPT 页数:61 大小:327.49KB
返回 下载 相关 举报
ASM04汇编语言程序格式.ppt_第1页
第1页 / 共61页
ASM04汇编语言程序格式.ppt_第2页
第2页 / 共61页
ASM04汇编语言程序格式.ppt_第3页
第3页 / 共61页
ASM04汇编语言程序格式.ppt_第4页
第4页 / 共61页
ASM04汇编语言程序格式.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《ASM04汇编语言程序格式.ppt》由会员分享,可在线阅读,更多相关《ASM04汇编语言程序格式.ppt(61页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计,第4章 汇编语言程序格式,Assembly Language Programming,2,讲授要点常用伪指令与操作符。汇编语言源程序的基本框架。汇编语言程序的开发过程以 及程序的调试方法。,3,4.1 汇编程序框架,4.1.1 汇编程序产生流程,MASMPlus,ML.EXE,Link.EXE,4.1.2 汇编程序框架,.386data_seg1 segment data_seg1 endsdata_seg2 segment data_seg2 endscode_seg segmentassume cs:code_seg,ds:data_seg1,es:data_seg2st

2、art:movax,data_seg1movds,axmovax,data_seg2moves,ax code_seg endsend start,4,.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incinclude masm32.incincludelib user32.libincludelib kernel32.libincludelib masm32.libinclude macro.asm.data?bufferdb 100 dup(?)

3、.codestart:invoke StdOut,CTXT(Hello World!)invoke StdIn,addr buffer,sizeof buffer;暂停显示,回车键关闭invoke ExitProcess,0end start,控制台框架程序,5,.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.dataszCaptiondb单纯使用消息框的程

4、序!,0szTextdb世界,你好!你好!你好!,0.codestart:invokeMessageBox,NULL,offset szText,offset szCaption,MB_OKinvokeExitProcess,NULLend start,单纯使用消息框的程序框架,6,int MessageBox(HWND hWnd,/隶属的窗口(窗口句柄)LPCTSTR lpText,/在窗口中显示的字符串 LPCTSTR lpCaption,/窗口标题串 UINT uType/对话框风格(按钮类型与组合));uType:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的

5、组合。指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。MB_OK:消息框含有一个按钮:OK。这是缺省值。MB_OKCANCEL:消息框含有两个按钮:OK和Cancel。MB_ABORTRETRYIGNORE:消息框含有三个按钮:Abort,Retry和Ignore。MB_YESNOCANCEL:消息框含有三个按钮:Yes,No和Cancel。MB_YESNO:消息框含有两个按钮:Yes和No。MB_RETRYCANCEL:消息框含有两个按钮:Retry和Cancel。指定下列标志中的一个来显示消息框中的图标:标志的含义如下。MB_ICONWARNING:显示惊叹号图标MB_ICONI

6、NFORMATION:显示消息图标MB_ICONASTERISK:显示危险图标,消息框函数,7,MB_ICONQUESTION:显示问号图标MB_ICONSTOP:显示停止图标。指定下列标志中的一个来显示缺省的按钮:标志的含义如下。MB_DEFBUTTON1:第一个按钮为缺省按钮。不指定时,此项为缺省值。MB_DEFSUTTON2:第二个按钮为缺省按钮。MB_DEFBUTTON3:第三个按钮为缺省按钮。MB_DEFBUTTON4:第四个按钮为缺省按钮。另外,可以指定下列标志。MB_DEFAULT_DESKTOP_ONLY:接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。MB_HELP

7、:把一个Help按钮增加到消息框。选择Help按钮或按F1产生一个Help事件。MB_RIGHT:文本为右对齐。MB_RTLREADING:从右到左的顺序显示消息和大写文本。MB_SETFOREGROUND:消息框变为前景窗口。MB_TOPMOSI:消息框用WS_EX_TOPMOST窗口类型来创建。,8,返回值:如果没有足够的内存来创建消息框,则返回值为零。如果函数调用成功,则返回值为下列对话框返回的菜单项目值中的一个:IDOK:OK(=1)按钮被选中。IDCANCEL:Cancel(=2)按钮被选中。IDABORT:Abort(=3)按钮被选中。IDRETRY:Retry(=4)按钮被选中。

8、IDIGNORE:Ignore(=5)按钮被选中。IDYES:YES(=6)按钮被选中。IDNO:NO(=7)按钮被选中。如果一个消息框有一个Cancel按钮,且如果Esc键被按下或Cancel键被选择,则函数返回IDCANCEL值。如果消息框没有Cancel按钮,则按Esc键没有作用。,9,.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incinclude gdi32.incincludelib user32.libincludelib kerne

9、l32.libincludelib gdi32.libinclude macro.asm.data?hInstancedd?hWinMaindd?.constszClassName db MyClass,0szCaptionMain db 窗口框架程序!,0szText db 使用 MASM32 创建的纯汇编语言 Windows 程序!,0,Win32窗口程序框架,10,.code_ProcWinMainproc uses ebx edi esi,hWnd,uMsg,wParam,lParam;窗口过程localstPs:PAINTSTRUCTlocalstRect:RECTlocalhDcm

10、oveax,uMsg.if eax=WM_PAINTinvokeBeginPaint,hWnd,addr stPsmovhDc,eaxinvokeGetClientRect,hWnd,addr stRectinvokeDrawText,hDc,addr szText,-1,addr stRect,DT_SINGLELINE or DT_CENTER or DT_VCENTERinvokeEndPaint,hWnd,addr stPs.elseif eax=WM_CLOSEinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULL.elseinv

11、okeDefWindowProc,hWnd,uMsg,wParam,lParamret.endifxoreax,eaxret_ProcWinMainendp,11,_WinMainproclocalstWndClass:WNDCLASSEXlocalstMsg:MSG;注册窗口类invokeRtlZeroMemory,addr stWndClass,sizeof stWndClassinvokeLoadCursor,0,IDC_ARROWmovstWndClass.hCursor,eaxpushhInstancepopstWndClass.hInstancemovstWndClass.cbSi

12、ze,sizeof WNDCLASSEXmovstWndClass.style,CS_HREDRAW or CS_VREDRAWmovstWndClass.lpfnWndProc,offset _ProcWinMainmovstWndClass.hbrBackground,COLOR_WINDOW+1movstWndClass.lpszClassName,offset szClassNameinvokeRegisterClassEx,addr stWndClass;建立并显示窗口invokeCreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,o

13、ffset szCaptionMain,WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL,12,movhWinMain,eaxinvokeShowWindow,hWinMain,SW_SHOWNORMALinvokeUpdateWindow,hWinMain;消息循环.whileTRUEinvokeGetMessage,addr stMsg,NULL,0,0.break.if eax=0invokeTranslateMessage,addr stMsginvokeDispatchMessage,addr stMsg.end

14、wret_WinMainendp;-start:invokeGetModuleHandle,NULLmovhInstance,eaxcall_WinMaininvokeExitProcess,NULL;-endstart,13,14,程序结构,.386;.686/.xmm.model flat,stdcalloption casemap:noneinclude 头文件includelib 库文件 常量定义、宏定义 结构、共用体、数据类型等的定义 函数原型说明.data;定义初始化数据.data?;定义非初始化数据.const;定义常量数据.stack;定义堆栈段尺寸.code;定义程序代码st

15、art:;程序入口invokeGetModuleHandle,NULLmovhInstance,eaxcall_WinMaininvokeExitProcess,NULL;程序到此结束 end start,invokeGetCommandLinemovCommandLine,eax,可以将主程序或子程序放在此处,15,4.2 80X86汇编语言的基本语法,和其他计算机语言一样,80X86汇编语言的基本语法主要包括:1.词法(字符集、标识符、保留字)2.句法(指令语句、伪指令语句)3.以及程序结构的若干规定。,16,4.2.1 字符集 汇编语言的基本元素是字符,字符按一定语法规则的有序组合就是语

16、句。80X86 汇编语言允许使用的字符是:英文字母:AZ 和 az 数字字符:09 算术运算符:+-*/关系运算符:分隔符:,;:()SPACE TAB 控制符:CR,LF,FF 其它字符:$&_?%!,17,4.2.2 标识符,标识符用来对程序中的常量、变量、记录、结构、段、过程、模块等进行命名,应符合如下规定:标识符第一个字符必须是字母,?,_,&,$后续字符可以是字母,?,_,&,$,数字 一个标识符的长度可以由 247 个字符组成。如:_sum x?block tablename 等均是合法的变量名。,18,4.2 80X86汇编语言的基本语法,4.2.3 保留字80X86中的寄存器名

17、、指令助记符、伪操作命令、表达式运算符以及属性操作符等都是系统专用的保留字,不能做标识符。如:AX、BX、ADD、DB、DW、DD、+、-、.COUNT、NAME 等,都是保留字。,19,4.2 80X86汇编语言的基本语法,4.2.4 语句 80X86汇编语言有两类语句指令性语句 是机器指令的符号表示,经汇编后产生一一对应的机器指令代码;伪指令 不产生代码,它提供一些确保指令性语句正确汇编的信息。MASM对语句格式的要求:大小写无关。每条语句必须占行,但可以使用续行符“”。为了提高可读性,应该使各个域对齐,20,4.2 80X86汇编语言的基本语法,指令性语句标号:前缀指令助记符操作数;注释

18、例:GOON:ADD AX,1;AX加1GOON是标号,只能出现在代码段中,后必须跟:号,指令性语句在程序运行时使机器产生动作,也可以说是在程序运行时被执行的。伪指令语句名字 伪操作命令 操作数;注释例:X DB 100X是变量名,DB为伪操作符,100是分配给X的值。伪指令语句在源程序被汇编时由汇编程序处理的操作。该语句的作用是为X变量分配一个存储单元,并且把100存入其中。,21,4.2 80X86汇编语言的基本语法,4.2.5 程序结构一个80X86汇编语言程序是若干条指令性语句和非指令性语句的集合,并以SEGMENT和ENDS将程序分成若干个段,但最多只能有四种;整个源程序以END l

19、ablei 结束,lablei 表示程序执行时的启动地址。一个源程序可以分模块编写,每一模块独立汇编生成 OBJ 文件,多模块最后连接成一个可执行程序。包含启动地址的模块称主模块,22,4.3 基本伪操作,伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、定义程序模式、定义数据、分配存储区、指示程序开始结束等功能。处理器选择伪操作段定义伪操作程序开始和结束伪操作数据定义及存储分配表达式赋值伪操作赋值伪操作地址计数器与对准伪操作基数控制伪操作,23,4.3.1 处理器选择伪指令,在缺省方式下,MASM只承认8086指令。为了使用更高的CPU指令,必须使用处理器选择伪指令,主要包括:.

20、8086.286/.286P(含.287).386/.386P(含.387).486/.486P.586/.586P.686/.686P.MMX.XMM分别表示其后面的代码使用相应CPU的指令。其中,结尾的 P 表示使用特权指令。若使用32位CPU新增指令以及寄存器或内存寻址方式,则至少要用.386伪指令,24,4.3.2 段定义伪操作,1.完整的段定义伪操作 基本形式 段名 SEGMENT 定位类型 组合类型 使用类型 类别.段名 ENDS数据/附加/堆栈段:存储单元定义和数据分配代码段:指令、伪指令段名作为操作数出现在指令中时,MASM将其视为立即数,表示段地址,25,定位类型:BYTE(

21、不对齐),WORD(偶数边界),DWORD(4的倍数),QWORD(8的倍数),PARA(小段边界,16的倍数。为默认值),PAGE(页边界,256)组合类型:(连接时的段合并方法)PRIVATE:私有段,连接时不与其它同名段合并。(为默认值)PUBLIC:按连接命令指定的顺序合并同名段,每模块从小段边界开始。COMMON:重叠存放同名段(覆盖模式)AT 表达式:段地址由表达式计算(不能用此方法指定代码段)MEMORY:与PUBLIC相同 START:合并同名堆栈段使用类型:USE16 使用16位寻址方式(段长64KB)USE32 使用32位寻址方式(段长4GB)类别:类名,用于段的合并。,4

22、.3.2 段定义伪操作,26,明确段寄存器和段的关系 ASSUME 段寄存器:段名,段寄存器:段名明确指出段与段寄存器的缺省对应关系,即告诉MASM某个段的段地址在哪个段寄存器里。实际上,数据段之所以成为数据段,是由于DS指向它。由于程序运行时可以改变DS的值,使得任何段都可以成为数据段。因此,当程序定义一个段后,需要告诉汇编器该段的段地址在哪个段寄存器中。ASSUME就提供这种信息。,4.3.2 段定义伪操作,27,4.3.2 段定义伪操作,取消段寄存器和段的关系 ASSUME NOTHING 设置段寄存器的初值 ASSUME只是告诉汇编器段寄存器指向哪个段,并不设置段寄存器的值;CS与IP

23、的初值不能在程序中显式设置,由系统自动设置为END后指定的起始地址;DS、ES的初值必须在程序中用MOV指令设置;SS与SP的初值可在程序中显式设置。然而,若堆栈段定义时给出了属性STACK,则由系统自动设置;,28,4.3.2 段定义伪操作,例:定义用户堆栈 stack_seg segment dw 40H dup(?)tos label word stack_seg ends code_seg segment mov ax,stack_seg mov ss,ax mov sp,offset tos code_seg ends,STACK,40H,(SP),(SS),29,例:,data_s

24、eg1 segmentdata_seg1 ends;定义数据段data_seg2 segmentdata_seg2 ends;定义附加段code_seg segment assume cs:code_seg,ds:data_seg1,es:data_seg2start:mov ax,data_seg1 mov ds,ax mov ax,data_seg2 mov es,ax;段地址段寄存器 code_seg ends end start,4.3.2 段定义伪操作,30,2.简化段定义伪操作MODEL 伪操作.MODEL 内存模式,语言类型,堆栈选项;用来指出存储模式内存模式:Tiny Smal

25、l Medium Compact Large Huge Flat语言类型:C BASIC FORTRAN PASCAL SYSCALL STDCALL堆栈类型:NEARSTACK 或 FARSTACK基本形式.CODE 名.DATA.DATA?.FARDATA 名.FARDATA?名.CONST.STACK 尺寸 缺省为1KB,4.3.2 段定义伪操作,31,rep movsb;串传送 mov si,0;显示 mov bx,offset target again:mov dl,bx+si mov ah,2 int 21h inc si cmp si,80 jb again.exit 0end,

26、预定义符号,.model small,stdcall.stack.data source db 33h,34h,35h,36h;在数据区定义4个字符数据 target db 80 dup();分配复制数据空间420=80.code.startup mov ax,ds mov es,ax cld mov si,offset source mov di,offset target mov cx,80,4.3.2 段定义伪操作,32,4.3.3 程序开始和结束伪操作,指定程序名字 NAME module_name TITLE text源程序结束:END 地址功能:表示汇编语言源程序到此结束,对END

27、之后的语句不再进行汇编。可选的地址指出程序执行的起始点,通常是标号或过程名。若程序包含多个源文件,则每个源文件的最后必须有一条END语句,但只有主模块文件可以指出执行的起始地址,33,数据定义及存储器分配伪操作,格式:变量 类型助记符 操作数,操作数,;注释类型助记符:DB,DW,DD,DF,DQ,DT,BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE,REAL4,REAL8,REAL10.操作数可以是常数、用 EQU 或=定义的符号常量、表达式、?和DUP子句等。其中,?表示只保留内存空间,未定义初始值。DUP子句的格式为:重复次数 D

28、UP(操作数,操作数)DATA_WORD DW 100,100HDATA_BYTE DB 100 DUP(?)MESS1 DB ABMESS2 DW AB,34,例:OPER1 DB?,?OPER2 DW?,?MOV OPER1,0;字节指令 MOV OPER2,0;字指令例:OPER1 DB 1,2 OPER2 DW 1234H,5678H MOV AX,OPER1+1 MOV AL,OPER2 类型不匹配 MOV AX,WORD PTR OPER1+1 MOV AL,BYTE PTR OPER2(AX)=3402H(AL)=34H,数据定义及存储器分配伪操作,35,说明(1)变量可以定义在

29、任何段(包括代码段),但一般定义在数据段。(2)用DW/DD/DQ/DF/DT定义的数据在内存按“低字节在低地址”的方式存放。例如:S1DBAB;等价于 S1 DB 41H,42H S2DWAB;等价于 S2 DW 4142H;256进制数(3)当DW与DD后的操作数是地址表达式时,分别表示其16位偏移地址和32位分段地址(段地址在高字,偏移地址在低字)。例如:XDB10 DUP(?)ADDR1DW X;ADDR1的内容(字)为变量X的偏移地址ADDR2DDX;ADDR2的高字为X的段地址,低字为X的偏移地址,数据定义及存储器分配伪操作,36,(4)MASM是强类型的。变量在定义后,其类型便被

30、确定,使用时要注意类型匹配。例如:OP1DB?,?OP2DW?,?下列两条指令执行不同类型的操作:MOVOP1+1,0;字节操作指令,将0作为1个字节送到地址OP1+1MOVOP2+2,0;字操作指令,将0作为1个字送到地址OP2+2然而,下列两条指令是错误的:MOVOP1,AX;类型不匹配MOVOP2,AL;类型不匹配若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理?可以采用下面介绍的LABEL伪指令或类型操作符PTR等。,数据定义及存储器分配伪操作,37,5.LABEL 基本形式:名字LABEL类型 功能:将名字作为一个符号地址,指定其类型,地址由所在位置确定。然而,

31、并不为名字分配内存空间。说明:当类型是BYTE、WORD、DWORD时,名字作为相应类型的变量;当类型是NEAR或FAR时,名字作为相应类型的标号。,数据定义及存储器分配伪操作,38,【例】定义地址相同、类型不同的两个变量。balabelbytewadw50 dup(?)将100个字节的数组首地址赋予两个不同类型的变量:字节类型变量BA与字类型变量WA。尽管WA+2与BA+2指向同一内存地址,但下列两条指令的操作类型不同:mov wa+2,0;将0作为1个字送到地址WA+2 mov ba+2,0;将0作为1个字节送到地址BA+2,数据定义及存储器分配伪操作,39,4.3.5 赋值伪操作,表达式

32、赋值伪操作(EQU)不占存储单元格式:表达式名 EQU 表达式 CONSTANT EQU 256 ALPHA EQU 7 BETA EQU ALPHA-2“=”伪操作(允许重复定义)格式:变量=表达式 EMP=7 EMP=EMP+1,40,4.3.6 地址计数器$,$保存当前正在汇编的指令的地址例:ORG$+8;跳过8个字节的存储区 JNE$+6;转向地址是JNE的首址+6$用在伪操作的参数字段表示地址计数器的当前值 array DD 1,$+4,2,$+4 num equ($-array)/TYPE array;与 LENGTHOF array 的结果相同,00000084,0000007C

33、,41,4.3.7 基数控制与对准伪操作,基数控制伪操作RADIX格式:.RADIX 表达式(2,8,10,16)功能:规定无标记数的基数例:.RADIX 16 MOV BX,0FF MOV BX,178D 对准伪操作EVEN 格式:EVEN功能:使下一地址从偶地址开始A DB morningEVENB DW 2 DUP(?),42,4.3.7 基数控制与对准伪操作,对准伪操作ORG格式:ORG 常数表达式 功能:使下一地址是常数表达式的值 ORG 100HSTART:.对准伪操作ALIGN格式:ALIGN boundry/dataType功能:使下一地址从boundry的整数倍开始,boun

34、dry的值为2的幂.ALIGN 4ARRAY DD 100 DUP(?),;1,2,4,8,16,43,4.4 汇编语言数据与表达式,数据是指令和伪指令语句中操作数的基本组成部分,它的大小和属性对机器语言代码的生成有直接关系。汇编语言能识别的数据是常量、变量和标号。4.4.1 常量 4.4.2 变量 4.4.3 标号 4.4.4 表达式和运算符,44,4.4 汇编语言数据与表达式,4.4.1 常量常量是汇编时已经确定的值,主要用于伪指令中给变量赋值,或作为指令语句中的立即数或存储器操作数的组成部分(如位移量)。为了便于程序设计,常量有多种表示形式,缺省的基数是十进制,且可以用RADIX改变。常

35、量可以用数值形式直接写在汇编语言的语句中,也可以预先为它定义一个名字,供程序员编程时直接引用。这里,用名字表示的常量为符号常量,符号常量使用伪指令EQU或=进行定义。例:PI EQU 3.1415926e+0,45,4.4 汇编语言数据与表达式,4.4.1 常量,46,4.4 汇编语言数据与表达式,4.4.2 变量变量用于定义存储器中的数据,这些数据在程序运行过程中可随时修改。为了便于对变量的访问,变量常常以变量名的形式出现在程序中。变量名可以认为是存放数据的存储单元符号地址,它的三个属性是:段属性:指变量所在段的段基址偏移地址属性:指变量所在段中的偏移量,即变量所在地址与段基址之间的字节距离

36、。类型属性:(指变量占用存储单元的字节数)SBYTE、SWORD、SDWORD、FWORD、QWORD、TBYTE,可用DB、DW、DD、DF、DQ、DT进行定义。REAL4、REAL8、REAL10 表示实数类型变量。例:XBYTE DB 1,2,3 XWORD DW 123,456,789,47,4.4 汇编语言数据与表达式,4.4.3 标号标号是给指令性语句所在地址取的名字,它表明该指令在存储器中的位置,可作为转移类指令的操作数,以确定程序转移的目标地址。和变量一样,标号也有以下三个属性:段属性:指标号所在段的段基址偏移地址属性:指标号所在段中的偏移量,即标号所在地址与段基址之间的字节距

37、离。距离属性(或类型属性):标号可作为转移和调用指令的目标地址,也可作为过程定义伪指令的过程名。有 NEAR(段内,隐含)和 FAR(段间)之分。可以用LABEL伪指令加以改变。,48,4.4 汇编语言数据与表达式,4.4.4 表达式和运算符常量、变量和标号是汇编语言中表示数据的基本形式,其组合就构成表达式。有两类:一类是数值表达式,它只产生一个数值结果;另一类是地址表达式,它所产生的结果是一个存储器地址,如果这个地址存放的是数据,则称它为变量;如果这个地址中存放的是指令,就称它为标号。地址表达式,基本形式为:变量名或标号名 常数其类型由相应的变量或标号确定。两个地址表达式的差表示两个地址之间

38、的距离(字节数),两个地址必须在同一个段内。注意,不能将两个地址表达式相加。$是一个特殊的地址表达式,表示当前地址,即地址计数器的当前值。,49,算术操作符七种:+、-、*、/、MOD、SHL、SHR结果类型:均为整数;功能:/取商;MOD取余;SHL和SHR可使二进制数左移或右移若干位。NUM=15*4MOV DX,BLOCK+(6-1)*2;将BLOCK数组的第6个字传送到DX寄存器MOV AL,00001010B SHL 4;(AL)=10100000B如:数组ARRAY定义如下,把数组长度存入CX的指令:MOV CX,(END-ARRAY)/2;程序在汇编时将表达式形成指令MOV CX

39、,7,4.4.4 表达式和运算符,50,4.4.4 表达式和运算符,逻辑操作符:AND,OR,XOR,NOT,输出总在偶数端口上例:OPR1 EQU 25 OPR2 EQU 7 AND AX,OPR1 AND OPR2,51,关系操作符:EQ,NE,LT,LE,GT,GE 计算结果为逻辑值:真-1,假 0 例:MOV FID,(OFFSET Y-OFFSET X)LE 128 X:Y:若128(真),汇编结果 MOV FID,-1若128(假),汇编结果 MOV FID,0例:MOV AX,5 EQ 101B;(AX)=0FFFFH MOV AH,10H GT 16;(AX)=0,关系和逻辑操

40、作符:=,!=,=,=,!,&,|(真为1,假为0),4.4.4 表达式和运算符,52,数值回送操作符该种运算符的运算对象必须是存储器操作数,即变量或标号。运算符总是加在运算对象之前,返回的结果是一个数值。SEG 加在变量或标号之前,返回变量或标号所在段的段基址。OFFSET 加在变量或标号之前,返回变量或标号所在段内的偏移地址。TYPE 加在变量之前,返回变量的类型尺寸(字节数);加在标号之前,返回标号的距离属性:变量:DB DW DD DF DQ DT 标号:NEAR FAR 值:1 2 4 6 8 10-1-2 LENGTHOF 加在变量名之前,返回的数值是变量中所定义的元素个数。SIZ

41、EOF 该运算符加在变量名之前,返回的数值是变量所占的总字节数,且等于LENTHOF和TYPE两个运算符返回值的乘积。,4.4.4 表达式和运算符,53,数值回送操作符例子:,;TYPEN1 DB 30H,31H,32HN2 DW 4142H,4344HN3 DD 12345678HLAB:MOV AL,TYPE N1MOV AL,TYPE N1;(AL)=1MOV AL,TYPE N2;(AL)=2MOV AL,TYPE N3;(AL)=4;LENTHOFN1 DB 10H DUP(?)N2 DW 4142H,4344HN3 DB 12345678LAB:MOV AL,TYPE N1MOV

42、AL,LENTH N1;(AL)=16MOV AL,LENTH N2;(AL)=2MOV AL,LENTH N3;(AL)=8,;SIZEOFN1 DB 10H DUP(?)N2 DW 4142H,4344HN3 DB 12345678LAB:MOV AL,TYPE N1MOV AL,SIZE N1;(AL)=16MOV AL,SIZE N2;(AL)=4MOV AL,SIZE N3;(AL)=8,54,4.4.4 表达式和运算符,修改属性运算符 修改属性运算符可用来修改变量、标号或地址表达式的属性“:”PTR THIS HIGH、HIGHWORD和LOW、LOWWORD运算符 SHORT 圆

43、括号运算符()方括号运算符 结构和记录的专用运算符、记录字段名、MASK、WIDTH,55,修改属性运算符,“:”用来临时给变量、标号或地址表达式指定一个段属性,自动生成段跨越前缀,例:MOV AX,ES:BX 但CS和ES不能被段跨越,堆栈操作时SS也不能被跨越。定义变量或参数类型,如 LOCAL iCount:DWORD 等 PTR用来指明某个变量、标号或地址表达式的类型或距离属性,或者使它们临时兼有与原定义不同的类型属性,但保持它们原来的段属性和偏移地址属性。类型 PTR 地址表达式根据地址表达式的不同,所赋给的新类型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBYT

44、E、NEAR、FAR等,它们只在所在的指令内有效。例如:DAT DB 4,5,7ADD BYTE PTR DI,4;指明目标操作数为字节类型JMP DWORD PTR BX;指明为段间转移MOV AX,WORD PTR DAT;临时修改DAT为字类型,(AX)=0504H类型别名 TYPEDEF PTR 已知类型;定义指针例:PBYTE TYPEDEF PTR BYTE;C 语言中的 unsigned char*CHAR TYPEDEF SBYTE;C 语言中的 char,56,THIS用来把它后面指定的类型或距离属性赋给当前的变量、标号和地址表达式,但不分配新的存储单元,下一个能分配存储单元

45、的段和偏移地址就是它的段和偏移地址.格式如下:THIS 类型这种运算往往与EQU或=连用,为当前存储单元定义一个指定类型的变量或标号,类型属性可以识BYTE、WORD、DWORD、NEAR、FAR.例:GAMA EQU THIS BYTE BETA EQU THIS FAR则,不管GAMA原来是什么类型,从本语句开始,GAMA将成为字节变量,而不管BETA原来是什么距离属性.从本语句开始,BETA将成为FAR远标号。A EQU THIS BYTE B DD 12345678H C EQU WORD PTR B则第一条语句将紧跟在它后面的双字变量定义为字节属性,并命名为A;第三条语句将双字变量B

46、定义为字属性并命名为C,供需要字类型变量时使用。,修改属性运算符,57,HIGH/HIGHWORD 和 LOW/LOWWORD 运算符分别用于从运算对象中分离出高字节/字和低字节/字。例如:K1 EQU 1234H MOV AL,LOW K1;(AL)=34HSHORT用于说明转移指令的目标地址与本指令之间的字节距离在-128127范围内,应用例子见JMP段内短转移指令。圆括号运算符()用于改变运算符的优先级别,()运算的优先级别最高。K1=10 OR 5 AND 1;K1=0BH K2=(10 OR 5)AND 1;K1=0BH mov eax,(DWORD PTR esi)+4,修改属性运

47、算符,58,方括号运算符该运算符可以是数组变量的下标(定义局部变量)或地址表达式(使用偏移地址),以区别操作数和操作数地址。例如:ALPHA DB 30H,31H,32H,33H,34H;ALPHA为数组变量 LOCAL x100:SDWORD;为x分配100个有符号双字的空间 MOV AL,ALPHA4;“4”为偏移地址,AL=32H MOV BX,OFFSET ALPHA;BX=ALPHA的偏移地址 MOV AL,BX;(AL)=30H结构、联合和记录的专用运算符STRUCT、UNION、ENDS、与结构和联合有关RECORD、MASK、WIDTH 位域、位域的掩码和宽度,修改属性运算符,

48、结构,定义结构:结构类型名 STRUCT域的声明结构类型名 ENDS,例子:POINT STRUCTx SDWORD 0y SDWORD?POINT ENDSpt1 POINT;(2,0)pt2 POINT;(8,?)pt3 POINT;(0,?)pt4 POINT 60 dup()TYPE POINT;8SIZEOF POINT;8SIZEOF pt1;8mov ecx,SIZEOF pt1mov edx,pt1.ylea eax,pt1mov eax,eax.POINT.x,使用:结构变量名.域名EA.结构类型名.域名(结构类型名 PTR EA).域名ASSUME eax:结构类型名 PT

49、R eax.域名 ASSUME eax:NOTHING 结构定义可以嵌套,59,;mov eax,offset pt1,联合,例子:Integer UNIONd DWORD1w WORD8b BYTE3Integer ENDSpt1 Integer;(20000H)pt2 Integer;(8)pt3 Integer;(1)pt4 Integer 60 dup(?)TYPE Integer;4SIZEOF pt1;4mov ecx,pt1.dmov dx,pt1.wlea eax,pt1mov eax,eax.Integer.xmov ax,word ptr Integer,定义联合:联合名 UNION域的声明联合名 ENDS,联合定义可以嵌套 结构名 STRUCT结构的域声明UNION 联合名联合的域声明ENDS 结构名 ENDS 为了减少引用层数可以将去除内部定义结构域名。,60,61,第四章作业Page 1551594.1 4.3 4.4 4.6 4.84.11 4.13 4.16 4.19,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号