资源预览内容
第1页 / 共61页
第2页 / 共61页
第3页 / 共61页
第4页 / 共61页
第5页 / 共61页
第6页 / 共61页
第7页 / 共61页
第8页 / 共61页
第9页 / 共61页
第10页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
汇编语言程序设计第4章 汇编语言程序格式Assembly Language Programming2讲授要点讲授要点u常用伪指令与操作符。常用伪指令与操作符。u 汇编语言源程序的基本框架。汇编语言源程序的基本框架。u 汇编语言程序的开发过程以汇编语言程序的开发过程以 及程序的调试方法。及程序的调试方法。34.1 汇编程序框架汇编程序汇编程序编辑程序编辑程序连接程序连接程序PROGRAM.ASMPROGRAM.OBJPROGRAM.EXE4.1.1 汇编程序产生流程MASMPlusML.EXELink.EXE4.1.2 汇编程序框架.386data_seg1 segment data_seg1 endsdata_seg2 segment data_seg2 endscode_seg segmentassume cs:code_seg, ds:data_seg1, es:data_seg2start:start:movax, data_seg1movds, axmovax, data_seg2moves, ax code_seg endsend startend start4.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(?).codestart:start:invoke StdOut, CTXT(Hello World!)invoke StdIn, addr buffer, sizeof buffer;暂停显示暂停显示,回车键关闭回车键关闭invoke ExitProcess, 0 end startend start控制台框架程序5.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.dataszCaptiondb单纯使用消息框的程序!单纯使用消息框的程序!, 0szTextdb世界,你好!你好!你好!世界,你好!你好!你好!, 0.codestart:start:invokeMessageBox, NULL, offset szText, offset szCaption, MB_OKinvokeExitProcess, NULL end startend start单纯使用消息框的程序框架6 int MessageBox( HWND hWnd,/ 隶属的窗口(窗口句柄)隶属的窗口(窗口句柄) LPCTSTR lpText,/ 在窗口中显示的字符串在窗口中显示的字符串 LPCTSTR lpCaption,/ 窗口标题串窗口标题串 UINT uType / 对话框风格(按钮类型与组合)对话框风格(按钮类型与组合) );uTypeuType:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。组中标志的组合。组中标志的组合。组中标志的组合。指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。指定下列标志中的一个来显示消息框中的按钮,标志的含义如下。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_ICONINFORMATION:显示消息图标:显示消息图标MB_ICONASTERISK: 显示危险图标显示危险图标消息框函数7MB_ICONQUESTION: 显示问号图标显示问号图标MB_ICONSTOP: 显示停止图标显示停止图标。 。指定下列标志中的一个来显示缺省的按钮:标志的含义如下。指定下列标志中的一个来显示缺省的按钮:标志的含义如下。指定下列标志中的一个来显示缺省的按钮:标志的含义如下。指定下列标志中的一个来显示缺省的按钮:标志的含义如下。MB_DEFBUTTON1:第一个按钮为缺省按钮。不指定时,此项为缺省值。:第一个按钮为缺省按钮。不指定时,此项为缺省值。MB_DEFSUTTON2:第二个按钮为缺省按钮。:第二个按钮为缺省按钮。MB_DEFBUTTON3:第三个按钮为缺省按钮。:第三个按钮为缺省按钮。MB_DEFBUTTON4:第四个按钮为缺省按钮。:第四个按钮为缺省按钮。另外,可以指定下列标志。另外,可以指定下列标志。另外,可以指定下列标志。另外,可以指定下列标志。MB_DEFAULT_DESKTOP_ONLY:接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。MB_HELP: 把一个把一个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) 按钮被选中。按钮被选中。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 kernel32.libincludelib gdi32.libinclude macro.asm.data?hInstancedd?hWinMaindd?.constszClassName db MyClass, 0szCaptionMain db 窗口框架程序!窗口框架程序!, 0szText db 使用使用 MASM32 创建的纯汇编语言创建的纯汇编语言 Windows 程序!程序!, 0Win32窗口程序框架10.code_ProcWinMainproc uses ebx edi esi, hWnd, uMsg, wParam, lParam ; 窗口过程窗口过程localstPs:PAINTSTRUCTlocalstRect:RECTlocalhDcmoveax, 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.elseinvokeDefWindowProc, hWnd, uMsg, wParam, lParamret.endifxoreax, eaxret_ProcWinMainendp11_WinMainproclocalstWndClass:WNDCLASSEXlocalstMsg:MSG; 注册窗口类注册窗口类invokeRtlZeroMemory, addr stWndClass, sizeof stWndClassinvokeLoadCursor, 0, IDC_ARROWmovstWndClass.hCursor, eaxpushhInstancepopstWndClass.hInstancemovstWndClass.cbSize, 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, offset szCaptionMain,WS_OVERLAPPEDWINDOW,100, 100, 600, 400, NULL, NULL, hInstance, NULL12movhWinMain, eaxinvokeShowWindow, hWinMain, SW_SHOWNORMALinvokeUpdateWindow, hWinMain; 消息循环消息循环.whileTRUEinvokeGetMessage, addr stMsg, NULL, 0, 0.break.if eax = 0invokeTranslateMessage, addr stMsginvokeDispatchMessage, addr stMsg.endwret_WinMainendp;-start:start:invokeGetModuleHandle, NULLmovhInstance, eaxcall_WinMaininvokeExitProcess, NULL;-endendstartstart1314程序结构.386 ; .686 / .xmm.model flat, stdcalloption casemap:noneinclude 头文件头文件includelib 库文件库文件 常量定义、宏定义常量定义、宏定义 结构、共用体、数据类型等的定义结构、共用体、数据类型等的定义 函数原型说明函数原型说明.data; 定义初始化数据定义初始化数据.data?; 定义非初始化数据定义非初始化数据.const; 定义常量数据定义常量数据.stack; 定义堆栈段尺寸定义堆栈段尺寸.code; 定义程序代码定义程序代码start:start: ; 程序入口程序入口invokeGetModuleHandle, NULLmovhInstance, eaxcall_WinMaininvokeExitProcess, NULL ; 程序到此结束程序到此结束 end startend startinvoke GetCommandLinemovCommandLine, eax可以将主程序或子程序放在此处可以将主程序或子程序放在此处可以将主程序或子程序放在此处可以将主程序或子程序放在此处154.2 80X86汇编语言的基本语法 和其他计算机语言一样,和其他计算机语言一样,80X86汇编语言的基本汇编语言的基本语法主要包括:语法主要包括:1.词法(字符集、标识符、保留字)词法(字符集、标识符、保留字)2.句法(指令语句、伪指令语句)句法(指令语句、伪指令语句)3.以及程序结构的若干规定。以及程序结构的若干规定。 164.2.1 字符集字符集 汇编语言的基本元素是字符,字符按一定语汇编语言的基本元素是字符,字符按一定语法规则的有序组合就是语句。法规则的有序组合就是语句。 80X86 汇编语言允汇编语言允许使用的字符是:许使用的字符是: 英文字母:英文字母:AZ 和和 az 数字字符:数字字符:09 算术运算符:算术运算符:+ - * / 关系运算符:关系运算符: 分隔符分隔符: , ; : ( ) SPACE TAB 控制符:控制符:CR,LF,FF 其它字符:其它字符:$ & _ ? % !174.2.2 标识符标识符 标识符用来对程序中的常量、变量、记录、结构、标识符用来对程序中的常量、变量、记录、结构、段、过程、模块等进行命名,应符合如下规定:段、过程、模块等进行命名,应符合如下规定: 标识符标识符第一个字符第一个字符必须是必须是字母字母字母字母, ? ?, _ _, , & , $ $ 后续字符后续字符可以是可以是字母字母字母字母, ? ?, _ _, , & , $ $, 数字数字数字数字 一个标识符的长度可以由一个标识符的长度可以由 247 个字符组成。个字符组成。如:如:_sum x ?block tablename _sum x ?block tablename 等均是合法的等均是合法的变量名。变量名。 184.2 80X86汇编语言的基本语法4.2.3 保留字80X86中的寄存器名、指令助记符、伪操作命令、表达式运算符以及属性操作符等都是系统专用的保留字,不能做标识符。如:如:AXAX、BXBX、ADDADD、DBDB、DWDW、DDDD、+ +、- -、.COUNT.COUNT、NAME NAME 等,都是保留字。等,都是保留字。194.2 80X86汇编语言的基本语法4.2.4 语句 80X86汇编语言有两类语句指令性语句指令性语句 是机器指令的符号表示,经汇编后产生一一对应的机器指令代码;伪指令伪指令 不产生代码,它提供一些确保指令性语句正确汇编的信息。 MASM对语句格式的要求: 大小写无关。 每条语句必须占行,但可以使用续行符“”。 为了提高可读性,应该使各个域对齐204.2 80X86汇编语言的基本语法指令性语句标号:前缀指令助记符操作数;注释例: GOONGOON: ADD AXADD AX,1 1 ; ; AXAX加加1 1GOON是标号,只能出现在代码段中,后必须跟: :号,指令性语句在程序运行时使机器产生动作,也可以说是在程序运行时被执行的。伪指令语句名字 伪操作命令 操作数;注释例: X X DB DB 100100X是变量名,DB为伪操作符,100是分配给X的值。伪指令语句在源程序被汇编时由汇编程序处理的操作。该语句的作用是为X变量分配一个存储单元,并且把100存入其中。214.2 80X86汇编语言的基本语法4.2.5 程序结构程序结构一个80X86汇编语言程序是若干条指令性语句和非指令性语句的集合,并以SEGMENT和ENDS将程序分成若干个段段段段,但最多只能有四种;整个源程序以END lablei 结束,lablei 表示程序执行时的启动地址。一个源程序可以分模块编写分模块编写, 每一模块独立汇编生成 OBJ 文件,多模块最后连接成一个可执行程序。 包含启动地址的模块称主模块主模块 224.3 基本伪操作伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、定义程序模式、定义数据、分配存储区、指示程序开始结束等功能。处理器选择伪操作段定义伪操作程序开始和结束伪操作数据定义及存储分配表达式赋值伪操作赋值伪操作地址计数器与对准伪操作基数控制伪操作234.3.1 处理器选择伪指令在缺省方式下,MASM只承认8086指令。为了使用更高的CPU指令,必须使用处理器选择伪指令,主要包括:.8086 .286/.286P(含.287) .386/.386P (含.387).486/.486P.586/.586P.686/.686P.MMX .XMM分别表示其后面的代码使用相应CPU的指令。其中,结尾的 P 表示使用特权指令。 若使用32位CPU新增指令以及寄存器或内存寻址方式,则至少要用.386伪指令244.3.2 段定义伪操作1. 完整的段定义伪操作 基本形式 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 使用类型使用类型 类别类别 . 段名段名 ENDS数据数据/附加附加/堆栈段堆栈段: 存储单元定义和数据分配存储单元定义和数据分配代码段代码段: 指令、伪指令指令、伪指令段名作为操作数出现在指令中时,段名作为操作数出现在指令中时,MASM将其视为立即数,表示段地址将其视为立即数,表示段地址25定位类型:定位类型:BYTE(不对齐不对齐),WORD(偶数边界偶数边界),DWORD(4的倍数的倍数),QWORD(8的倍数的倍数),PARA(小段边界,小段边界,16的倍数。为默认值的倍数。为默认值),PAGE(页边界,页边界,256)组合类型:组合类型:(连接时的段合并方法)(连接时的段合并方法) PRIVATE :私有段,连接时不与其它同名段合并。:私有段,连接时不与其它同名段合并。(为默认值)(为默认值) PUBLIC :按连接命令指定的顺序合并同名段,每模块从小段边界开始。:按连接命令指定的顺序合并同名段,每模块从小段边界开始。 COMMON:重叠存放同名段(覆盖模式):重叠存放同名段(覆盖模式) AT 表达式:段地址由表达式计算(不能用此方法指定代码段)表达式:段地址由表达式计算(不能用此方法指定代码段) MEMORY:与:与PUBLIC相同相同 START :合并同名堆栈段:合并同名堆栈段使用类型:使用类型: USE16 USE16 使用使用1616位寻址方式(段长位寻址方式(段长64KB64KB) USE32 USE32 使用使用3232位寻址方式(段长位寻址方式(段长4GB4GB) 类别:类别:类名,用于段的合并。类名,用于段的合并。4.3.2 段定义伪操作26 明确段寄存器和段的关系 ASSUME 段寄存器 : 段名,段寄存器 : 段名明确指出段与段寄存器的缺省对应关系,即告诉MASM某个段的段地址在哪个段寄存器里。实际上,数据段之所以成为数据段,是由于DS指向它。由于程序运行时可以改变DS的值,使得任何段都可以成为数据段。因此,当程序定义一个段后,需要告诉汇编器该段的段地址在哪个段寄存器中。ASSUME就提供这种信息。4.3.2 段定义伪操作274.3.2 段定义伪操作 取消段寄存器和段的关系 ASSUME NOTHING 设置段寄存器的初值 ASSUME只是告诉汇编器段寄存器指向哪个段,并不设置段寄存器的值;CS与IP的初值不能在程序中显式设置,由系统自动设置为END后指定的起始地址;DS、ES的初值必须在程序中用MOV指令设置;SS与SP的初值可在程序中显式设置。然而,若堆栈段定义时给出了属性STACK,则由系统自动设置;284.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 endsSTACK40H(SP)(SS)29例:data_seg1 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 start4.3.2 段定义伪操作302. 简化段定义伪操作MODEL 伪操作 .MODEL 内存模式 , 语言类型 , 堆栈选项 ; 用来指出存储模式内存模式: Tiny Small Medium Compact Large Huge Flat语言类型:C BASIC FORTRAN PASCAL SYSCALL STDCALL堆栈类型:NEARSTACK 或 FARSTACK基本形式.CODE 名.DATA.DATA?.FARDATA 名.FARDATA? 名.CONST.STACK 尺寸 缺省为1KB4.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 预定义符号.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, 804.3.2 段定义伪操作324.3.3 程序开始和结束伪操作指定程序名字 NAME module_name TITLE text源程序结束: END 地址功能: 表示汇编语言源程序到此结束,对END之后的语句不再进行汇编。可选的地址指出程序执行的起始点,通常是标号或过程名。 若程序包含多个源文件,则每个源文件的最后必须有一条END语句,但只有主模块文件可以指出执行的起始地址33ABMESS1BAMESS24.3.4数据定义及存储器分配伪操作格式: 变量 类型助记符 操作数 , 操作数 , ; 注释类型助记符:类型助记符:DB, DW, DD, DF, DQ, DT, BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, TBYTE, REAL4, REAL8, REAL10.操作数可以是常数、用 EQU 或 = 定义的符号常量、表达式、?和DUP子句等。其中,?表示只保留内存空间,未定义初始值。DUP子句的格式为:子句的格式为: 重复次数 DUP (操作数,操作数)DATA_WORD DW 100, 100HDATA_BYTE DB 100 DUP (?)MESS1 DB ABMESS2 DW AB340102 3412 78 56OPER1 OPER2例: 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)=34H4.3.4数据定义及存储器分配伪操作35说明说明(1)变量可以定义在任何段(包括代码段),但一般定义在数据段。)变量可以定义在任何段(包括代码段),但一般定义在数据段。(2)用用DW/DD/DQ/DF/DT定定义义的的数数据据在在内内存存按按“低低字字节节在在低低地地址址”的的方方式式存存放放。例如:例如:S1DBAB; 等价于等价于 S1 DB 41H, 42H S2DWAB; 等价于等价于 S2 DW 4142H ; 256进制数进制数(3)当当DW与与DD后后的的操操作作数数是是地地址址表表达达式式时时,分分别别表表示示其其16位位偏偏移移地地址址和和32位位分分段地址(段地址在高字,偏移地址在低字)。例如:段地址(段地址在高字,偏移地址在低字)。例如:XDB10 DUP (?)ADDR1 DW X ; ADDR1的内容(字)为变量的内容(字)为变量X的偏移地址的偏移地址ADDR2 DDX ; ADDR2的高字为的高字为X的段地址,低字为的段地址,低字为X的偏移地址的偏移地址4.3.4数据定义及存储器分配伪操作36(4) MASM是强类型的。变量在定义后,其类型便被确定,使用时要注意类型匹配。是强类型的。变量在定义后,其类型便被确定,使用时要注意类型匹配。 例如:例如:OP1DB?, ?OP2DW?, ?下列两条指令执行不同类型的操作:下列两条指令执行不同类型的操作:MOVOP1 + 1, 0 ; 字节操作指令,将字节操作指令,将0作为作为1个字节送到地址个字节送到地址OP1 + 1MOVOP2 + 2, 0 ; 字操作指令,将字操作指令,将0作为作为1个字送到地址个字送到地址OP2 + 2然而,下列两条指令是错误的:然而,下列两条指令是错误的:MOVOP1, AX; 类型不匹配类型不匹配MOVOP2, AL; 类型不匹配类型不匹配若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理?若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理?可以采用下面介绍的可以采用下面介绍的LABEL伪指令或类型操作符伪指令或类型操作符PTR等。等。4.3.4数据定义及存储器分配伪操作375. LABEL5. LABEL 基本形式:基本形式:名字名字名字名字LABELLABELLABELLABEL类型类型类型类型 功功能能:将名字作为一个符号地址,指定其类型,地址由所在位置确定。然而,并不为名字分配内存空间。 说说说说明明明明:当类型是BYTE、WORD、DWORD时,名字作为相应类型的变量;当类型是NEAR或FAR时,名字作为相应类型的标号。4.3.4数据定义及存储器分配伪操作38【例】 定义地址相同、类型不同的两个变量。balabel bytewadw50 dup (?) 将100个字节的数组首地址赋予两个不同类型的变量:字节类型变量BA与字类型变量WA。尽管WA + 2与BA + 2指向同一内存地址,但下列两条指令的操作类型不同: mov wa + 2, 0; 将0作为1个字送到地址WA + 2 mov ba + 2, 0; 将0作为1个字节送到地址BA + 24.3.4数据定义及存储器分配伪操作394.3.5 赋值伪操作表达式赋值伪操作(EQU)不占存储单元格式: 表达式名 EQU 表达式 CONSTANT EQU 256 ALPHA EQU 7 BETA EQU ALPHA-2 “=”伪操作 (允许重复定义)格式:变量 = 表达式 EMP = 7 EMP = EMP+1404.3.6 地址计数器$ $保存当前正在汇编的指令的地址例: ORG $+8 ; 跳过8个字节的存储区 JNE $+6 ; 转向地址是JNE的首址+6$用在伪操作的参数字段表示地址计数器的当前值 array DD 1, $+4 , 2, $+4 num equ ($-array) / TYPE array ; 与与 LENGTHOF array 的结果相同的结果相同 01 01 00000074 00000074 000000000000arrayarray7C 000000787C 000000780000000000000202000084 0000008084 00000080000078+4=0000007C80+4=000000840000000000000000000000840000007C414.3.7 基数控制与对准伪操作基数控制伪操作RADIX格式:. RADIX 表达式 (2,8,10,16) 功能: 规定无标记数的基数例: .RADIX 16 MOV BX, 0FF MOV BX, 178D 对准伪操作EVEN 格式: EVEN功能:使下一地址从偶地址开始A DB morningEVENB DW 2 DUP (?)424.3.7 基数控制与对准伪操作对准伪操作ORG格式: ORG 常数表达式 功能:使下一地址是常数表达式的值 ORG 100HSTART: . 对准伪操作ALIGN格式: ALIGN boundry / dataType功能:使下一地址从boundry的整数倍开始, boundry的值为2的幂. ALIGN 4ARRAY DD 100 DUP(?); 1, 2, 4, 8, 16434.4 汇编语言数据与表达式 数据是指令和伪指令语句中操作数的基本组成部分,它的大小和属性对机器语言代码的生成有直接关系。汇编语言能识别的数据是常量、变量和标号。 4.4.1 常量 4.4.2 变量 4.4.3 标号 4.4.4 表达式和运算符 444.4 汇编语言数据与表达式4.4.1 常量常量是汇编时已经确定的值,主要用于伪指令中给变量赋值,或作为指令语句中的立即数或存储器操作数的组成部分(如位移量)。为了便于程序设计,常量有多种表示形式,缺省的基数是十进制,且可以用RADIX改变。常量可以用数值形式直接写在汇编语言的语句中,也可以预先为它定义一个名字,供程序员编程时直接引用。这里,用名字表示的常量为符号常量,符号常量使用伪指令EQU或=进行定义。例:PI EQU 3.1415926e+0 454.4 汇编语言数据与表达式4.4.1 常量数据形式数据形式格格 式式X X取取值值范范围围举举 例例注注 释释二二进进制制XXXXXXXXBXXXXXXXXB01011010011B1010011B八八进进制制XXXQXXXQ0707123Q123Q十十进进制制XXXDXXXD XXX XXX09090909168D168D168168缺省形式缺省形式十六十六进进制制XXHXXH0F0F0A3H0A3H最前面必最前面必须须是是0909ASCIIASCIIXXXXXXASCIIASCIIABCABC十十进进制制实实数数XXXXXXEXXEXXXX0909252528E-728E-7浮点数形式浮点数形式十六十六进进制制实实数数X XXRXR0F0F68FDER68FDER最前面必最前面必须须是是0909,有效位有效位应为应为8 8,1616,2020位位464.4 汇编语言数据与表达式4.4.2 变量变量用于定义存储器中的数据,这些数据在程序运行过程中可随时修改。为了便于对变量的访问,变量常常以变量名的形式出现在程序中。变量名可以认为是存放数据的存储单元符号地址,它的三个属性是:段属性: 指变量所在段的段基址偏移地址属性: 指变量所在段中的偏移量,即变量所在地址与段基址之间的字节距离。类型属性: (指变量占用存储单元的字节数) SBYTE、SWORD、SDWORD、FWORD、QWORD、TBYTE, 可用DB、DW、DD、DF、DQ、DT进行定义。REAL4、REAL8、REAL10 表示实数类型变量。例: XBYTE DB 1,2,3 XWORD DW 123,456,789474.4 汇编语言数据与表达式4.4.3 标号标号是给指令性语句所在地址取的名字,它表明该指令在存储器中的位置,可作为转移类指令的操作数,以确定程序转移的目标地址。和变量一样,标号也有以下三个属性:段属性:指标号所在段的段基址偏移地址属性:指标号所在段中的偏移量,即标号所在地址与段基址之间的字节距离。距离属性(或类型属性):标号可作为转移和调用指令的目标地址,也可作为过程定义伪指令的过程名。有 NEAR(段内,隐含)和 FAR(段间)之分。可以用LABEL伪指令加以改变。484.4 汇编语言数据与表达式4.4.4 表达式和运算符常量、变量和标号是汇编语言中表示数据的基本形式,其组合就构成表达式。有两类:一类是数值表达式,它只产生一个数值结果;另一类是地址表达式,它所产生的结果是一个存储器地址,如果这个地址存放的是数据,则称它为变量;如果这个地址中存放的是指令,就称它为标号。地址表达式, 基本形式为:变量名或标号名 常数其类型由相应的变量或标号确定。 两个地址表达式的差表示两个地址之间的距离(字节数),两个地址必须在同一个段内。注意,不能将两个地址表达式相加。 $是一个特殊的地址表达式,表示当前地址,即地址计数器的当前值。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,74.4.4 表达式和运算符504.4.4 表达式和运算符逻辑操作符:AND, OR, XOR, NOT, & 只能用于数字表达式中 例: IN AL, PORT_VAL OUT PORT_VAL AND 0FEH, AL ; 输出总在偶数端口上例: OPR1 EQU 25 OPR2 EQU 7 AND AX, OPR1 AND OPR2汇编汇编AND AX, 151 关系操作符: 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关系和逻辑操作符:= =, !=, , =, , =, !, &, | | (真为真为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 加在变量名之前,返回的数值是变量中所定义的元素个数。 SIZEOF 该运算符加在变量名之前,返回的数值是变量所占的总字节数,且等于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 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)=8544.4.4 表达式和运算符修改属性运算符 修改属性运算符可用来修改变量、标号或地址表达式的属性“:” PTR THIS HIGH、HIGHWORD和LOW、LOWWORD运算符 SHORT 圆括号运算符() 方括号运算符 结构和记录的专用运算符 、记录字段名记录字段名、MASK、WIDTH 55修改属性运算符 “:”用来临时给变量、标号或地址表达式指定一个段属性,自动生成段跨越前缀,例:MOV AX,ES:BX 但CS和ES不能被段跨越,堆栈操作时SS也不能被跨越。定义变量或参数类型,如 LOCAL iCount:DWORD 等 PTR用来指明某个变量、标号或地址表达式的类型或距离属性,或者使它们临时兼有与原定义不同的类型属性,但保持它们原来的段属性和偏移地址属性。 类型类型 PTR 地址表达式地址表达式根据地址表达式的不同,所赋给的新类型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBYTE、NEAR、FAR等,它们只在所在的指令内有效。例如:DAT DB 4,5,7ADD BYTE PTR DI,4 ;指明目标操作数为字节类型JMP DWORD PTR BX ;指明为段间转移MOV AX,WORD PTR DAT ;临时修改DAT为字类型,(AX)=0504H类型别名类型别名 TYPEDEFTYPEDEF PTRPTR 已知类型已知类型; 定义指针例: PBYTE TYPEDEFTYPEDEF PTR BYTE; C 语言中的 unsigned char * CHAR TYPEDEF TYPEDEF SBYTE; C 语言中的 char56 THIS用来把它后面指定的类型或距离属性赋给当前的变量、标号和地址表达式,但不分配新的存储单元,下一个能分配存储单元的段和偏移地址就是它的段和偏移地址.格式如下: 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定义为字属性并命名为C,供需要字类型变量时使用。 修改属性运算符57HIGH / 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修改属性运算符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 位域、位域的掩码和宽度修改属性运算符结构定义结构:定义结构:定义结构:定义结构:结构类型名结构类型名 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:结构结构类型类型名名 PTR 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 为了减少引用层数可以将去除内为了减少引用层数可以将去除内部定义结构域名。部定义结构域名。6061第四章作业第四章作业Page 155159Page 1551594.1 4.3 4.4 4.6 4.84.1 4.3 4.4 4.6 4.84.11 4.13 4.164.11 4.13 4.16 4.19 4.19
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号