1 / 80

第四章 汇编语言程序格式

第四章 汇编语言程序格式. §4. 1 汇编语言的上机过程 §4. 2 汇编语言语句种类及格式 §4. 3 伪操作. 编辑. 汇编. 连接. 调试. 文本编辑器,如 EDIT.COM. 汇编程序,如 MASM.EXE. 连接程序,如 LINK.EXE. 调试程序,如 DEBUG.EXE. 错误. 错误. 错误. 应用程序. 汇编语言程序的开发过程. 源程序:文件名. asm. 目标模块:文件名. obj. 可执行文件:文件名. exe. 错误. §4. 2 汇编语言语句种类及格式. 指令语句 伪指令 宏指令.

sancho
Download Presentation

第四章 汇编语言程序格式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 汇编语言程序格式 §4.1 汇编语言的上机过程 §4.2 汇编语言语句种类及格式 §4.3 伪操作

  2. 编辑 汇编 连接 调试 文本编辑器,如 EDIT.COM 汇编程序,如 MASM.EXE 连接程序,如 LINK.EXE 调试程序,如 DEBUG.EXE 错误 错误 错误 应用程序 汇编语言程序的开发过程 源程序:文件名.asm 目标模块:文件名.obj 可执行文件:文件名.exe 错误

  3. §4.2汇编语言语句种类及格式 • 指令语句 • 伪指令 • 宏指令

  4. 一、指令语句 • 使CPU产生动作、并在程序执行时才处理的语句,就是第2章学习的处理器指令 • 书写格式 [标号:] 指令助记符 [DEST[ ,SRC]] [;注释] 标号:一条指令的符号地址。可以省略,如有必须以“:”作为结束标志。在程序段或子程序段的第一条指令处可使用标号,以在程序需要时转移到该处时,以标号的形式引用。

  5. 指令语句标号的命名 标号的命名:根据用途,由字母、数字、专用符号? - $@ 约定: • 最长31个字符 • 第一个字符不能是数字 • ? - $@可出现在标号的任意位置,但? $不能单独使用 • . 不能出现在起始位置 • 一个程序中,每个标识符的定义是唯一的,且不能与任何保留字相同

  6. 二、伪指令语句 • 不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等 • 伪指令与具体的处理器类型无关,但与汇编程序的版本有关 [名字] 伪指令 [操作数] [;注释]

  7. 伪指令语句—格式说明 • 符号名字段: • 与标号相区别,不带“:” • 可以是常量名、变量名、过程名、结构名、记录名等 • 可视为指令语句中的操作数(如符号名就表示一个常量或存储地址 • 命名规则与标号相同 • 伪指令字段:规定这条语句要求汇编程序完成的具体操作

  8. §4.2 伪操作 一、数据定义及存储器分配伪操作 二、表达式赋值伪操作 三、段定义伪操作 四、程序开始和结束伪操作 五、地址计数器及对准伪操作 六、基数控制伪操作 七、处理器选择伪操作

  9. 一、数据定义及存储器分配伪操作 • 格式: [Variable] Mnemonic Operand,…,Operand [;comments] Variable:可有可无,它用符号地址表示 Mnemonic:伪操作的注记符 Comments:注释 DB,DW,DD,DF,DQ,DT

  10. DATA_BYTE 一、数据定义及存储器分配伪操作 DATA_WORD • 例:DATA_BYTE DB 10,4,10H DATA_WORD DB 100,100H,-5 DATA_DW DD 3*20,0FFFDH DATA_DW

  11. MESSAGE 一、数据定义及存储器分配伪操作 MESSAGE1 • 例:MESSAGE DB ‘HELLO’ MESSAGE1 DB ‘AB’ MESSAGE2 DW ‘AB’ MESSAGE3 DW ‘A’,’B’,’C’ • 例: ABC DB 0,?,?,?,0 DEF DW ?,52,? MESSAGE2 MESSAGE3

  12. 一、数据定义及存储器分配伪操作 • 还可以使用复制操作符来复制某个操作数 repeat_count dup(operand,…, operand) 例: ARRAY1 DB 2 DUP(0,1,2,?) ARRAY2 DB 100 DUP(?) ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3)

  13. 一、数据定义及存储器分配伪操作 • 例:PARA_TABLE DW PAR1 DW PAR2 DW PAR3 INT_TABLE DD DATA1 DD DATA2 • 例: OPER1 DB ?,? OPER2 DW ?,? MOV OPER1,0 MOV OPER2,0

  14. 一、数据定义及存储器分配伪操作 • 例: 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 • BYTE,WORD,DWORD,FWORD,QWORD

  15. 一、数据定义及存储器分配伪操作 • NAME LABEL TYPE • 例: BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP(?) MOV WORD_ARRAY+2,0 MOV BYTE_ARRAY+2,0 SUB1_FAR LABEL FAR SUB1: MOV AL,30H

  16. 二、表达式赋值伪操作 • 等值语句 符号 EQU 表达式 ;将表达式的值赋给左边的符号 • 表达式的形式 1) 常数或数值表达式 CNT EQU 5 NUM EQU 13+5+4 • 等值语句仅在汇编源程序时作为替代符号用,不产生任何目标代码,不占存储单元 • 在同一程序中,同一符号不能用EQU重复定义 2) 地址表达式 ADR1 EQU DS:[BP+14] 3) 变量、标号或指令助记符 W0 EQU WORD PTR DA_BYTE

  17. 二、表达式赋值伪操作 • 等值语句 符号 = 表达式 ;功能与EQU相同,但可重复定义 CNT = 5 NUM = 4 …… NUM = NUM+10H CBD = DDA …… CBD = ADD

  18. 三、段定义伪操作 程序的段结构 段定义 段寻址(指定当前段) 段寄存器的装入

  19. 三、段定义伪操作—完整段定义伪指令 段名 SEGMENT [align_type][combine_type] [use_type][‘class‘] …… ;语句序列 段名 ENDS • 段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束 • 段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型 • 如果不指定,则采用默认参数;但如果指定,注意要按照上列次序

  20. 三、段定义伪操作 —段定位(align)属性 • 表示对逻辑段起始边界的选择,可为: PAGE 段从一个页边界开始 (XXX00H,256Bytes/Page) PARA 段节边界开始(XXXX0H) DWORD 段从一个4倍数地址开始 WORD 段从一个偶地址开始 BYTE 段可以从任意单元开始 • 完整段定义伪指令的默认定位属性是PARA

  21. 三、段定义伪操作 —段组合(combine)属性 • 指定多个段之间如何连接与定位,可为: PRIVATE本段与其他段没有连接关系,这是完整段定义伪指令默认的段组合方式 PUBLIC在满足定位关系的前提下,连接程序把本段与所有同名段相邻地连接在一起,形成新的逻辑段。 COMMON产生一覆盖段,两个同名段起始地址相同,用较长的段覆盖较短的段

  22. 三、段定义伪操作 —段组合(combine)属性 STACK把所有的同类别段连接在一起,段基值→SS,且自动为SP初始化。在一个程序中一般应该有一个堆栈段。

  23. 三、段定义伪操作 —使用类型(use_type)属性三、段定义伪操作 —使用类型(use_type)属性 • USE16 • USE32

  24. 三、段定义伪操作 —段类别(class)属性 • 当连接程序组织段时,将所有的同类别段相邻分配 • 段类别可以是任意名称,但必须位于单引号中 • 大多数MASM程序使用 'code'、'data'和'stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续

  25. DD1 DA1 12 12 10 12 DD2 DA2 13 20H 13 STA1 40H STA2 60H CODE DA1 SEGMENT PARA ‘DATA’ DD1 DB 10 DUP(12H) DA1 ENDS STA1 SEGMENT STACK ‘STACK0’ DW 20H DUP(?) STA1 ENDS DA2 SEGMENT PARA ‘DATA’ DD2 DB 20H DUP(13H) DA2 ENDS STA2 SEGMENT STACK ‘STACK0’ DW 30H DUP(?) STA2 ENDS CODE SEGMENT …… CODE ENDS

  26. ; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段.data_seg1 ends ; * * * * * * * * * * * * * * * * * * * * * * * data_seg2 segment ; 定义附加段.data_seg2 ends ; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2

  27. 三、段定义伪操作—段寻址 • 指明当前段 • 在程序运行过程中,可重新设置当前段,也可以删除原有的设置 ASSUME ES:NOTHING ;删除对ES的设置 ASSUME NOTHING ;删除对所有段的设置

  28. 三、段定义伪操作—段寄存器的装入 • ASSUME只说明了哪些段为当前段,具体的段基值并没有装入 DS与ES的装入 用ASSUME将DS/ES与相应的段建立联系后,用数据传送指令 MOV AX,段名 MOV DS/ES,AX

  29. 三、段定义伪操作—段寄存器的装入 SS的装入 在定义段时,用组合类型STACK说明 STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGEMNT ASSUME CS:CODE,SS:STACK1 …… SS获得STACK1的段基值,且SP=40H

  30. 三、段定义伪操作—段寄存器的装入 SS的装入(类似于DS/ES的方法) STACK1 SEGMENT DW 40H DUP(0) TOP LABEL WORD STACK1 ENDS …… CODE SEGEMNT ASSUME CS:CODE …… MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP ;SP=80H …… 中间不得插入其他指令

  31. 功能:标志源程序的结束 指定程序运行的起始地址 三、段定义伪操作—段寄存器的装入 CS的装入 用结束伪指令:每个源程序都必须以END伪指令结束 END 起始地址 标号 表达式

  32. 将后面的语句全部略去 将START所对应的程序在内 存中的位置装入CS和IP 三、段定义伪操作—段寄存器的装入 CS的装入 CODE SEGEMNT ASSUME CS:CODE,SS:STACK1 START: …… …… END START

  33. 算术操作(运算)符 逻辑操作(运算)符 关系操作(运算)符 数值返回操作(运算)符 属性修改操作(运算)符 运算符 运算符

  34. 运算符—算术运算符 • + - * / MOD SHR SHL [ ] • 实现加、减、乘、除、取模、移位的运算 MOV AX,3*4+5 ;等价于 MOV AX,17 • 其中MOD也称为取模,它产生除法之后的余数,如19 mod 7 = 5 • 加+和减-运算符还可以用于地址表达式 • 表达式 SHR/SHL CNT

  35. 算术运算符—例 NUM = 11011011B MOV AL,NUM SHL 3 MOV AL,11011000B MOV BL, NUM SHR 2 MOV AL,00110110B ADD DL, NUM SHR 6 ADD DL,00000011B MOV AL,ARRAY[BX][SI] MOV AL,ARRAY[BX+SI]

  36. 运算符—逻辑运算符 • AND OR XOR NOT • 实现按位相与、相或、异或、求反的逻辑运算 OR AL,03H AND 45H 0R AL, 01H MOV AX, NOT 0F0H MOV AX,0FF0FH MOV BL, 55H AND 0F0H MOV BL,50H

  37. 运算符—关系运算符 • EQ NE GT LT GE LE • 表达式1 关系运算符 表达式2 • 两个操作数必须都是数字,或者是同一段内的两个存储器地址 • MASM用0FFH/0FFFFH(补码 -1)表示条件为真 • MASM用0000H表示条件为假

  38. 运算符—关系运算符 • MOV BX,((PORT_VAL LT 5) AND 20) OR ((PORT_VAL GE 5) AND 30) • 则当PORT_VAL < 5时,汇编结果应该是:MOV BX, 20  否则,汇编结果应该是:MOV BX, 30

  39. 运算符—数值返回运算符 • 操作对象:存储器操作数(变量/标号) • 格式: 运算符 变量名/标号名 • SEG 名字/标号 返回名字或标号的段基值 MOV AX, SEG K1 • OFFSET 名字/标号 返回名字或标号的段内偏移地址 MOV SI, OFFSET VAR

  40. 运算符—数值返回运算符 • TYPE 名字/标号 返回名字或标号的类型属性,以数字形式表示

  41. 运算符—数值返回运算符(例) V1 DB ‘ABCD’ V2 DW 1234H,5678H V3 DD V2 …… MOV AL, TYPE V1 ;AL=1 MOV CL, TYPE V2 ;CL=2 MOV CH, TYPE V3 ;CH=4

  42. 运算符—数值返回运算符 • LENGTH 名字/标号 只用于变量,且为DUP所定义 如未用DUP定义则返回值为1 如使用DUP定义则返回最外层之值

  43. 运算符—数值返回运算符(例) K1 DB 10H DUP(0) K2 DB 10H,20H,30H K3 DW 20H DUP(0,1,2 DUP(2)) K4 DB ‘ABCD’ …… MOV AL,LENGTH K1 ;AL=10H MOV BL,LENGTH K2 ;BL=1 MOV CX,LENGTH K3 ;CX=20H MOV DX,LENGTH K4 ;DX=1

  44. 运算符—数值返回运算符 • SIZE 名字 只用于变量,得到重复定义的变量的数组元素所占字节数=LENGTH*TYPE

  45. K1 DB 10H DUP(0) K2 DB 10H,20H,30H K3 DW 20H DUP(0,1,2 DUP(2)) K4 DB ‘ABCD’ …… MOV AL,LENGTH K1 ;AL=10H MOV BL,LENGTH K2 ;BL=1 MOV CX,LENGTH K3 ;CX=20H MOV DX,LENGTH K4 ;DX=1 MOV AL,SIZE K1 ;AL=10H MOV BL,SIZE K2 ;BL=1 MOV CL,SIZE K3 ;CL=40H MOV DL,SIZE K4 ;DL=1

  46. 变量名 标号名 作为地址指针的R 变量:BYTE/WORD /DWORD 标号: NEAR/FAR 运算符—属性修改运算符 • 对存储器操作数(名字/标号)的属性进行修改 • PTR 运算符 类型 PTR 地址表达式 该修改是临时的,只在当前语句有效

  47. 运算符—属性修改运算符(例) DA_BYTE DB 20H DUP(0) DA_WORD DW 30H DUP(0) …… LEA BX DA_WORD LEA SI,DA_BYTE MOV AX,WORD PTR BA_BYTE[10H] ADD BYTE PTR DA_WORD[20H],BL INC BYTE PTR [BX] SUB WORD PTR [SI],30H AND AX,WORD PTR[BX][SI] JMP FAR PTR SUB1

  48. 运算符—THIS运算符 • THIS 类型名 • 利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型 • LABEL伪指令的功能等同于“EQU THIS” D_BYTE EQU THIS BYTE W_WORD DW 20H DUP(0) ;定义20H字单元,该区域可按字节访问,也可以按字访问 JMP_FAR EQU THIS FAR JMP_NEAR: MOV AL,30H

  49. 运算符—HIGH/LOW运算符 • 操作对象:常数/地址表达式 • 功能:取其高/低8位 CONST EQU 0ABCDH MOV AH,HIGH CONST ;AH=0ABH

  50. 运算符的优先级 1 () [] · LENGTH SIZE 2 PTR OFFSET SEG TPYE THIS : 3 HIGE LOW 4 * / MOD SHL SHR 5 + - 6 EQ NE GT LT GE LE 7 NOT 8 AND 9 OR XOR 10 SHORT • 建议采用圆括号“( )”显式表达,它可以极大地提高程序的可阅读性

More Related