第四章 汇编语言程序格式
汇编语言程序设计第四章-汇编语言程序格式
RESB/RESW/RESD
定义未初始化的字节/字/双字 型数据。
格式化输入和
MOV指令
将数据从内存传输到寄存器或将寄存器中 的数据传输到内存。
DIV指令
将第一个操作数除以第二个操作数并将商 存储在目标操作数中,余数存储在另一个 目标操作数中。
ADD指令
将两个操作数相加并将结果存储在目标操 作数中。
使用观察窗口
在调试器中设置观察窗口,实时监控变量的 变化。
04
汇编语言程序的应用
汇编语言程序在系统编程中的应用
系统内核开发
汇编语言常用于操作系统的内核开发,如Linux内核 中的启动代码部分。
系统工具开发
汇编语言用于开发系统工具,如磁盘驱动程序、文件 系统等。
系统优化
在性能敏感的系统软件中,如数据库管理系统,汇编 语言用于优化关键部分的性能。
伪指令(Pseudo-instructions)
伪指令是汇编语言中的特殊指令,用于为汇编器提供信息或指导其如何处理代码。例如, ORG、END、DB等。
汇编语言程序的组成
01
指令(Instructions)
指令是汇编语言中的基本单位,用于描述计算机执行的操作。例如,
MOV、ADD、SUB等。
02
操作数(Operands)
汇编语言程序设计第 四章-汇编语言程序
格式
目录
• 汇编语言程序的基本结构 • 汇编语言程序的格式化 • 汇编语言程序的调试 • 汇编语言程序的应用
01
汇编语言程序的基本结构
段和伪指令
段(Segment)
在汇编语言中,段是一个内存区域,用于存储程序代码、数据或堆栈。例如,代码段 (Code Segment)、数据段(Data Segment)和堆栈段(Stack Segment)。
第四章 汇编语言的程序格式
第四章汇编语言的程序格式4.1 汇编语言语句格式4.1.1 语句种类汇编语言程序实例(见77页)MYDATA SEGMENT ;定义数据段MESS1 DB 'PERSONAL COMPUTER $' ;定义字节数据MYDATA ENDSMYEXTRA SEGMENT ;定义附加段MESS2 DB 17 DUP (?) ;定义可存放17个字节数据MYEXTRA ENDSMYCODE SEGMENT ;定义代码段ASSUME CS:MYCODE,DS:MYDATA,ES:MYEXTRA ;指定段的性质START:MOV AX,MYDATAMOV DS,AX ;仍需将段的开始地址送相应的段存储器 MOV AX,MYEXTRAMOV EX,AX.JMP NEXT..LEA SI,MESS1LEA DI,MESS2NEXT: MOV CX,17CLD ;清方向标志为0REP MOVSB ;传送字符直到CX减为0...MYCODE ENDS ;段(代码)定义结束整个程序结束END START ;整个源程序结束这是汇编语言的源程序,通过下面的过程可汇编成可执行的EXE文件汇编语言程序的建立和汇编过程汇编语言由语句构成,语句分如下两类:(1)指令语句:完成一定的操作功能,能直接翻译成机器代码.第三章介绍的数据传送、算术运算、逻辑运算和移位指令等,后面还要介绍其他指令。
在程序装入内存后执行,完成某个计算任务;(2)伪指令语句(也称指示性语句):在对源程序进行编译时执行,只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器指令代码;MESS1 DB 'PERSONAL COMPUTER $' ;定义字节数据MESS2 DB 17 DUP (?) ;定义可存放17个字节数据除此之外还有宏指令,为多个指令定义一个代码;4.1.2 汇编语言程序的格式汇编语言的源程序是由各条语句构成的。
第4章 汇编语言程序格式
-
2012-12-28
qingyang@
19
例3 (参数是地址表达式)
TABLE1
PAR1偏移地址
PAR2偏移地址
TABLE1 DW PAR1 DW PAR2 TABLE2 DD DATA1 DD DATA2
TABLபைடு நூலகம்2
DATA1偏移地址 DATA1段地址 DATA2偏移地址
2012-12-28 qingyang@ 10
2) 逻辑运算符 • 有NOT、AND、OR、XOR共4个符号,分别表示 非、与、或、异或,可用于对两个(或一个)数据 进行操作。 • 例如, 在进行字操作时 1234H OR 2AFEH = 3AFEH, NOT 0F0H = 0FF0FH; 在字节操作时, NOT 0F0H = 0FH。
例如,因为操作类型不明确,指令 MOV[BX], 5 不能 通过汇编。下列两条指令有不同的执行结果。 MOV BYTE PTR [BX], 5 MOV WORD PTR [BX], 5
2012-12-28 qingyang@ 14
表达式的操作顺序
表达式中常用的伪操作符按以下顺序依次优先处理:
• 代码段的第一个语句一般是 “ASSUME”, ASSUME在段寄存器与段名之间建立了对应关系,例如段 名为 “DATA” 的段是数据段。
• 程序中主要有两类语句:指令语句(助记符指令),指示 性语句(伪指令)。
• 两种程序结构
2012-12-28 qingyang@ 6
4.3 语句类型和语句格式
注意:下列两条指令的功能完全相同。 MOV DX, OFFSET BLOCK LEA DX, BLOCK
2012-12-28 qingyang@ 13
第四章 汇编语言程序格式
内容:
一 、 汇编语言上机过程
二、 汇编语言程序结构
三、 指示性语句
1
上机环境
用户开发的程序:ABC.exe等
应用软件 系统软件 硬件
操作系统:DOS系统 编辑器: EDIT.exe 编程序: MASM.exe 连接程序:LINK.exe 调试程序:DEBUG.exe
CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备
5
二、语句结构
[名 字 ] [: ] 助记符 [ 操作数, ] [; 注 释 ]
名字项
助记符项
操作数项
注释项
1. 名字项
据语句功能的不同,
名字项可用来表示:
段名、变量名、 标号、过程名以及常量名等。
6
[名 字 ] [: ]
助记符
[ 操作数,
]
[; 注 释 ]
名字项
助记符项
操作数项
注释项
名字项用一个符号表示。 对符号的规定: ① 由字符A~Z ,a~z ,0~9及符号@、$、下划线_ 等组成,
18
三、变量定义伪操作
格式 变量名 类型助记符 操作数 [ ,操作数 , ... ] ▲ 用来定义程序中所用的内存操作数。 其中 变量名指示内存操作数的地址(符号地址) 类型助记符指示内存操作数的类型(字节、字、双字等) 操作数指示内存操作数的内容 ▲ 汇编程序将定义的操作数,按其类型分配内存单元数,
七、等值定义
15
一、模块定义和程序结束伪操作
1 . NAME 和 TITLE 伪操作
格式
格式
NAME
TITLE
模块名
模块名
▲ 在源程序开始可用 NAME 或 TITLE 为模块命名,
第4章 汇编语言程序格式
⑤属性修改运算符
对存储器操作数(名字/标号) 的属性进行修改
⑴.PTR运算符
格式
PTR 运算符 类型 PTR 地址表达式
变量:BYTE/WORD /DWORD 标号: NEAR/FAR
变量名 标号名
作为地址指针的R
该修改是临时的,只在当前语句有效
PTR运算符应用举例
DA_BYTE DA_WORD DB 20H DUP(0) 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
第4章 汇编语言程序格式
§4.1 §4.2 §4.3 §4.4 §4.5 变量、标号与表达式 基本伪指令 语句格式 源程序的基本框架 汇编语言程序的开发过程
§4.1 变量、标号与表达式
一、数值表式 二、变量与标号 三、地址表达式 四、地址计数器
一、数值表达式
数值表达式可以是一个整数、字符串 或者由若干运算符与运算分量构成。 数值表达式在汇编时求值。在汇编时, MASM根据运算符的优先级对表达式 的值进行计算,最终得到一个常数。
地址计数器应用举例
0: 3: 5: 8: A: C: mov mov mov mov shr ax,1d89h ds,ax ax,100 cl,4 ax,cl
DATA SEGMENT DATA ORG 30H DB1 DB 12H,34H ORG $+20H 30H STR DB ‘ABC’ CNT EQU $-STR EVEN DW1 DW 20H DUP(0) DATA ENDS …… CODE SEGMENT ASSUME CS:CODE,DS:DATA ORG 10H START:MOV AX,DATA MOV DS,AX …… CODE ENDS END START
汇编语言程序设计第四章 汇编语言程序格式
标号在代码段中定义,后面跟冒号:。标号有三 种属性:段,偏移及类型。
11
数据定义伪操作:把数据存入存储单元;分配空间; DW和DD可存储偏移地址或完整的地址。 下面举例说明:
例: 操作数可以是常数,或者 表达式(根据表达式可以求得一 个常数),如 DATA_BYTE DB 10,4,10H DATA_WORD DW 100,100H,-5 DATA_DW DD 3*20,0FFFDH 汇编程序在汇编期间在存储器中 存入数据,如图所示
…
…
26
code_seg segment; define code segment
assume cs:code_seg,ds:data_seg1,es:data_seg2
start: ;set DS register to current data segment mov ax,data_seg1 ;data segment addr mov ds,ax ;into DS register
;set ES register to current extra segment mov ax,data_seg2 ;extra segment addr mov es,ax ;into ES register code_seg ends end start
27
…
;end of segment
返回DOS
25
段寄存器:是CS,DS,ES和SS中的一个; 段名:是由SEGMENT定义的段名.
程序格式举例说明如下: data_seg1 segment ;define data segment
data_seg1 ends data_seg2 segment ;define extra segment
第4章汇编语言程序格式
• F DW 2*3
;一个字,即06H、00H。
• DUP(Duplication operator)
• 例1 COUNTER DB 6 DB „A‟, „ D‟,0DH, „$‟ TABLE1 DB 21,45H,255,10110111B 内存分配情况?
例2
WORD_VAR DW 89H,1909H,-1 DW 0ABCDH
;简化段定义2 .MODEL SMALL .CODE START: MOV DL,'3' MOV AH,2 INT 21H .EXIT 0 END START
4.3 程序中数据的组织 (参考教材P142)
• 程序中所涉及的数据除立即数、由指令产生的数、 通过键盘等读入的数据外,其他数据、中间结果 等都需要在程序设计中进行定义和分配。 • 变量的定义和预置
第4章 汇编语言程序格式
• 源程序书写格式 • 伪操作 • 程序中数据的组织
4.1 源程序书写格式
• 完整的段定义
– 一般格式如下:
<段名> SEGMENT …… <段名> ENDS • 一般格式书写结构:
<堆栈段名> SEGMENT STACK …… <堆栈段名> ENDS <数据段名> SEGMENT …… <数据段名> ENDS <代码段名> SEGMENT ASSUME定义 过程名或起始标号: …… <代码段名> ENDS END 过程名或起始标号
• 简化段定义
– .MODEL, .STACK, .DATA, .CODE
几点说明
• 源程序中的堆栈段、数据段和代码段是逻辑段。 源程序在汇编、连接后生成的段是物理段。逻 辑段和物理段的关系取决于伪指令ASSUME。 • 一个源程序至少有一个逻辑代码段和END伪 指令。 • 一个源程序文件可以含有多个逻辑数据段、多 个逻辑代码段、多个逻辑堆栈段。
第4章 汇编语言程序格式
medium
代码使用多个段 ,数据合并一个段
compact 所有代码使用一个段 ,数据可放多个段 large 数据和代码都可用多个段
伊力亚尔
《汇编语言》
2) 定位方式
(1)PARA:表示本段必须从能被16整除的地址处开始存放, 即段起始地址最低四位必须是0。 (2)WORD:表示本段要从一个偶数地址处开始存放,即段 起始地址的最低一位必须是0。 (3)BYTE:表示本段起始地址可以从任一地址处开始存放。 (4)PAGE:表示本段要从能被256整除的地址处开始存放, 即起始地址的最低八位必须是0。
SEGMENT STACK ; 定义堆栈段STACK ... ; 分配堆栈段的大小 STACK ENDS DATA SEGMENT ; 定义数据段 ... ; 定义数据 DATA ENDS CODE SEGMENT ‘CODE’ ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ; 程序开始 MOV DS,AX ... ; 程序代码 MOV AX,4C00H ; 程序终止,返回DOS INT 21H CODE ENDS ;代码段结束 ... ;子程序代码 END START ;汇编结束 STACK
伊犁师范学院
电子与信息工程学院
伊力亚尔
《汇编语言》
2. 存储模型与简化段定义伪指令
前面介绍了完整的段定义格式,用完整段定义格式虽然可以控制段 的各种属性,但程序员很少使用。现在的汇编程序提供了一种简化的 段定义方式,它使定义段更简单、方便。具体形式如下: .MODEL SMALL .STACK ;定义存储模式
第四章、汇编语言程序格式
4.1 汇编程序功能
编辑程序
PROGR.ASM 文件
汇编程序
MASM
PROGR.OBJ 文件
连接程序
LINK
在计算机上运行汇编语言的步骤: 用编辑程序建立ASM源文件 用MASM程序把ASM文件转换成OBJ文件 用LINK程序把OBJ文件转换成EXE文件 用DOS命令直接键入文件名就可以执行了
标 号
Addr dw number Number dw y Count dw ?
repeat:test ax,0ffffh
Jz exit Jns shift Inc cx Shift: shl ax ,1 Jmp repeat Exit: mov count, cx Mov ah,4ch Int 21h
Data ends Code segment Assume cs:code,ds:data
Start: mov ax,data Mov ds , ax Mov cx,0 Mov bx, addr Mov ax, [bx]
Repeat:test ax,0ffffh Jz exit Jns shift Inc cx Shift: shl ax,1 Jmp repeat Exit: mov count,cx Mov ah,4ch Int 21h
标号(label)是程序开始执行的起始地址
使用格式:
END [label]
例如:
Data segment
Addr dw number Number dw y Count dw ?
Data ends Code segment Assume cs: code,ds:data
Start: mov ax,data Mov ds , ax Mov cx,0 Mov bx, addr Mov ax, [bx]
第04章 汇编语言程序格式
4.1 伪指令
例4.3 定义数据段并为DS赋值。 data SEGMENT …… data ENDS code SEGMENT ASSUME CS:code,DS:data …… MOV AX,data MOV DS,AX …… code ENDS
5/63
内容提要
程序结构 段定义 ASSUME 例4.3 过程定义 程序结束
4.1 伪指令
② 符号常量:为常用量定义一个名字。 <符号名> EQU <表达式> <符号名> = <表达式>
其中表达式可以是常数、变量、标号、寄 存器名等。 例4.13 X1 EQU 50
Y2= BX 则:MOV AX,X1 等价于:
MOV AX,50
18/63
内容提要
程序结构 变量定义
3学时
本章主要内容 本章主要内容:
4.1 伪指令 4.2 DOS功能调用 4.3 汇编语言源程序格式 4.4 汇编语言程序的上机过程
2/63
内容提要
程序结构 段定义 ASSUME 例4.3 过程定义 程序结束
变量定义 地址计数器
4.1 伪指令
一、程序结构伪指令 1. 段定义伪指令
段的段地址; ② 变量的偏移属性:是指从段的起始地址
到定义变量的位置之间的字节数,也称 为变量的偏移地址; ③ 变量的类型属性,定义该变量时所保留 的字节数目。
15/63
内容提要
程序结构 变量定义
变量 标号 表达式 地址计数器
4.1 伪指令
2. 标号定义 标号在代码段中定义,后跟冒号,是指令 在存储器中存放地址的符号表示。 标号也具有三个属性:
汇编第4章 程序格式
tos
MOV tos, 0
0064H
五、表达式赋值伪操作
格式:表达式名 EQU 表达式 功能:给表达式赋予一个名字,在程序中用表达式名代替该表达式。
ALPHA BETA BB
EQU EQU EQU
9 ALPHA+18 [BP+8]
“ = ” 伪操作 (允许重复定义)
…… EMP = 7 …… EMP = EMP+1 ……
; 与EVEN等价
七、 基数控制伪操作
. RADIX 表达式
MOV
; 规定无标记数的基数
BX, 0FFH
MOV
BX, 178
.RADIX MOV MOV
16
BX, 0FF BX, 178D
4.3 汇编语言程序格式
源程序的每条语句可表示为:
[名字] 标号 变量 操作 指令 伪指令 宏指令 操作数 [; 注释]
0000H
34H 12H
000AH
SEG1 BUFFER
78H 56H
0014H
57H 13H
001EH
100H
START:
EVEN
;使下一地址从偶地址开始
第4章——汇编语言程序格式
画图说明下列语句分配的存贮空间及初始化的数据值。 ①BYTE_VAR DB ‘BYTE’,12,12H,2 DUP(0,?,3 DUP(1,2),?) ②WORD_VAR DW 4 DUP(0,1,2),?,-5,‘ BY’,‘ TE’,256H
第四章 汇编语言
4.1、伪指令
data segment d1 db 12h,34h,56h,78h,9ah,0abh,0bch,0cdh d2 db 0cdh,0bch,0abh,9ah,78h,56h,34h,12h data ends stack segment stack sta db 80 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack start : mov ax,data mov ds,ax ┇ code ends end start
第四章 汇编语言
4.2、汇编语言程序格式 二、汇编语言组成 [标识符] 操作项 操作数项 [;注释项] 标识符
1、字符个数为:1~31个 标识符的第一个字符必须是字母,问号“?”, “@”或下划线“_”这四种字符 中的一个; 从第二个字符开始,可以是字 母,数字,?,@或_。 2、 不能使用系统专用保留字。 3、标识符可以是标号,也可以是变量名。 ① 标号:标号在代码段中定义,后面跟冒号:,标号有三种属性:段、偏移及 类型。 段属性:定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段 则总是在CS寄存器中。 偏移属性:标号的偏移地址是16位元符号数,它代表从段起始地址到定义标 号的位置之间的字节数。 类型属性:用来指出该标号是在本段内引用还是在其它段中引用的。NEAR 和FAR。
第4章 汇编语言程序格式
(三) 段组定义伪操作
汇编程序自动地把名数据段组成一个段组DGROUP,以便程序在访问 数据段时使用一个数据段寄存器DS。 格式:grpname GROUP segname [, segname …] 说明:grpname为段组名,segname则为段名。 例2:DSEG1 SEGMENT WORD PUBLIC ‘DATA’ ┆ DSEG1 ENDS DSEG2 SEGMENT WORD PUBLIC ‘DATA’ ┆ DSEG2 ENDS DATAGROUP GROUP DSEG1, DSEG2 CSEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS: CSEG, DS: DATAGROUP START: MOV DS, AX ┆ MOV AX, 4C00H INT 21H CSEG ENDS END START
4 类别(Class)——当连接程序组织段时,将所有的同类别段相邻分配。 段类别可以任意命名,但必须位于单引号中,大多数MASM程序使用 ‘code’、‘data’和‘stack’来分别指示代码段、数据段和堆栈段。
(二) 存储模型与简化段定义伪操作
1 MODEL伪操作 格式:.MODEL memory_model [, model options]
3 与简化段定义有关的预定义符号 如数据段的装入: ①数据段有段名时----完整段定义 MOV AX, DATA_SEG1 MOV DS, AX ②数据段没有段名时----简化段定义 MOV AX, @DATA MOV DS, AX 例1: .MODEL SMALL ┆ .STACK 100H MOV AX, 4C00H .DATA INT 21H ┆ END START .CODE START: MOV AX, @DATA MOV DS, AX
第四章:汇编语言程序格式
汇编
AND AX, OPR1 AND OPR2
(3)关系操作符:EQ, NE, LT, LE, GT, GE 计算结果为逻辑值:真 0FFFFH
假 0000H
例:MOV FID, (OFFSET Y - OFFSET X) LE 128 X: …… …… Y: …… 若128(真) 若128(假) 汇编结果 MOV FID, -1 汇编结果 MOV FID, 0
4
表达式赋值伪操作EQU(不占存储单元) 格式:表达式名 EQU 表达式 CONSTANT EQU 256 ALPHA EQU 7 BETA EQU ALPHA-2
“=”伪操作 (允许重复定义) 格式:变量=表达式 … EMP=7 … EMP=EMP+1 …
5
段定义伪操作 格式: 段名 SEGMENT [定位类型, 组合类型, 类别] …… 段名 ENDS
7
程序开始和结束伪操作 格式:TITLE 程序名 END [程序首地址标号] 对准伪操作 EVEN ;使下一地址从偶地址开始 A DB „morning‟ EVEN B DW 2 DUP (?)
ORG 常数表达式 ;使下一地址是常数表达式的值 ORG 100H START: …...
8
$ 地址计数器:保存当前正在汇编的指令的地址 例: ORG $+8 ; 跳过8个字节的存储区 JNE $+6 ; 转向地址是JNE的首址+6 例:$用在伪操作的参数字段——表示地址计数器的当前值 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4
ARRAY
01 00 02 00 7C 00 03 00 04 00 82 00
0074
0078
第4章 汇编语言程序格式
WORD——从字边界(偶数地址)开始
DWORD——从双字边界(4的倍数地址)开始 PAGE——从低8位物理地址为0处开始
(2) 组合类型(combine_type)说明程序连接时的段合并方法,可以是:
PRIVATE——私有段,不与其它模块中的同名段合并——默认值 PUBLIC——公有段,连接时与其它模快中的同名段合并成一个段
4.2.1 处理机选择伪操作
.8086 . 286 . 286P . 386 . 386P 选择8086指令系统 选择80286指令系统 选择保护模式下的80286指令系统 选择80386指令系统 选择保护模式下的80386指令系统
. 486
. 486P . 586
选择80486指令系统
选择保护模式下的80486指令系统 选择Pentium指令系统
CS:CSEG,DS:DATAGROUP
START:MOV MOV ……
AX,DATAGROUP DS,AX
4.3.3 程序开始和结束伪操作
1. 开始伪操作
在程序的开始可以用NAME或TITLE作为模块的名字,NAME的格式是: NAME 模块名
如果程序中没有使用NAME伪操作,则也可使用TITLE,其格式为: TITLE text
例4.2 .MODEL SMALL .STACK 100h .DATA 例4.3 .MODEL SMALL .STACK 100h .CONST …… .DATA …… AX,@DATA DS,AX .CODE START: MOV AX,DGROUP
……
.CODE START: MOV MOV …… MOV INT END AX,4C00H 21H START
③ uninitialized data
第4章 汇编语言程序格式
COMPACT:压缩模式,一个代码段,允许多个数据段
LARGE:大模式,可有多个代码段和多个数据段。 FLAT:允许用户使用32位位移量 HUGE:允许数据段超过64KB
(2) 简化段定义伪操作 (MASM 5.0以上)
.CODE [name]
.DATA .DATA ?
.FARDATA [name] .FARDATA ? [name] .CONST .STACK [size]
DATA SEGMENT
VAR1 DB VAR2 DB DB BUF1 BUF2 DW DD 10H 10,11,12 0FFH,0 1234H,5678H 12345678H
BUF2
BUF1 DATA VAR1 VAR2
10H 0AH 0BH 0CH FFH 00H 34H 12H 78H 56H 78H 56H 34H 12H
AT expression:使段地址是表达式所计算出来的16位值。但不能用来指定代码段。
(3)类别
类别用来区分是代码段、数据段或堆栈段等,使用时必须用单引号括起来,习 惯上数据段用‘DATA’,代码段用‘CODE’,堆栈段用‘STACK’,连接程序会把 类别相同的逻辑段,存放于连续的存储器中。
(4)使用类型(段长度)
格式:LEA DX,缓冲区首偏移地址
MOV AH,10 INT 21H 功能:从键盘上输入一字符串到用户定义的输入缓冲中, 并送显示器显示。
中断 21H 的功能 A 能从键盘读入一串字符并把它存入用户定义的缓冲区中.
在数据区定义的字符缓冲区如下: MAXLEN DB ACTLEN DB 32 ? DATA SEGMENT STR DB 50, 0,50 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA READ_KEYS PROC FAR MOV AX , DATA MOV DS , AX LEA DX , STR MOV AH , 0AH
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.model small .data …… .code start: mov ax, @data mov ds, ax …… mov ax, 4c00h int 21h end start
9
段组定义伪操作
dseg1 dseg1 dseg2 dseg2 segment …… ends segment …… ends word public ‘data’
DATA_BYTE DATA_WORD
DB DW
10,4,10H,? 100,100H,-5,?
14
ARRAY
DB DB DW
‘HELLO’ ‘AB’ ‘AB’
ARRAY
48H 45H 4CH
4CH
4FH 41H 42H 42H 41H
PAR1 PAR2 ADDR_TABLE
DW DW DW
100,200 300,400 PAR1,PAR2
.STARTUP .EXIT [ return_value ]
13
数据定义及存储器分配伪操作:
[变量] 助记符 操作数 [ , 操作数 , … ] [ ; 注释] 助记符:DB DW DD DF DQ DT
DATA_BYTE 0AH 04H
10H
DATA_WORD 64H 00H 00H 01H FBH FFH -
12 ; (bx)=0 ; (bx)=2 ; (bx)=2
?
datagroup group data1,data2
code segment assume cs:code, ds:datagroup
; (bx)=0
程序开始和结束伪操作:
TITLE text
NAME module_name
END [ label ]
(1) MODEL 伪操作
.MODEL 存储模式 [,语言类型] [,操作系统类型] [,堆栈选项] 存储模式:tiny
huge small flat medium compact large
.model small .stack 100H .data …… .code .startup …… .exit 0 end
23
表达式操作:
(1) 算术操作符: 、 、、 、mod
MOV DX, BLOCK+(6-1)*2
ARRAY ARYEND
DW DW MOV
1,2,3,4,5,6,7 ? CX, (ARYEND-ARRAY)/2
; 符号地址常数 有意义 ; 时意义不明确 ;
ADD MOV
AX, BLOCK+2 AX, BX+1
VAR
DB DB
100 DUP (?) 2 DUP (0,2 DUP(1,2),3)
15
OPER1 OPER2
DB ?, ? DW ?, ? …… MOV OPER1, 0 MOV OPER2, 0
;字节指令 ;字指令
OPER1 OPER2
DB 1, 2 DW 1234H, 5678H …… MOV AX, OPER1+1 MOV AL, OPER2 MOV MOV AX, WORD PTR AL, BYTE PTR
LABEL
0064H
17
表达式赋值伪操作:
表达式名 EQU 表达式
B ALPHA BETA EQU EQU EQU [BP+8] 9 ALPHA+18
“ = ” 伪操作 (允许重复定义)
…… EMP = 7 …… EMP = EMP+1 ……
18
地址计数器与对准伪操作:
地址计数器 $ :保存当前正在汇编的指令的地址
3
处理器选择伪操作:
.8086 选择 8086 指令系统
.286 .386 .486 .586 选择 80286 指令系统 选择 80386 指令系统 选择 80486 指令系统 选择 Pentium 指令系统 .286P 选择保护模式下的 80286 指令系统 .386P 选择保护模式下的 80386 指令系统 .486P 选择保护模式下的 80486 指令系统 .586P 选择保护模式下的 Pentium 指令系统
25
(3) 关系操作符: EQ、NE、LT、LE、GT、GE
计算结果为逻辑值:真 0FFFFH 假 0000H MOV FID, (OFFSET Y - OFFSET X) LE 128
X: …… …… Y: …… FID, -1
若 128 (真) 汇编结果: MOV
若 128 (假) 汇编结果: MOV
word
public
‘data’
datagroup
cseg start:
group
dseg1, dseg2
segment assume
para public ‘code’ cs:cseg, ds:datagroup
cseg
mov mov …… mov int ends end
ax, datagroup ds, ax
(1) 定位类型 align_type
PARA BYTE WORD DWORD PAGE
(2) 组合类型 combine_type
PRIVATE PUBLIC COMMON STACK AT exp
(3) 使用类型 use_type
USE16 USE32
(4) 类别 ‘class’
7
存储模式与简化段定义伪操作
第四章
汇编语言程序格式
汇编程序功能
伪操作
汇编语言程序格式
汇编语言程序的上机过程
1
1. 汇编程序功能
编辑程序
program.asm
汇编程序
program.obj
连接程序
program.exe
汇编程序的主要功能:
• 检查源程序,给出出错信息。
• 产生目标文件(.obj)和列表文件(.lst)。 • 展开宏指令。
ax, 4c00h 21h start
10
data1 segment word const1 dw 100 data1 ends
data2 segment word var1 dw ? data2 ends
start: mov ax, datagroup mov ds, ax mov ax, const1 mov var1, ax mov bx, offset var1 mov bx, offset data1 mov bx, offset data2 assume ds:data2 mov ax, data2 mov ds, ax mov ax, var1 mov bx, offset var1 mov ax, 4c00h int 21h code ends end start
0074
0078
007E
19
ORG 伪操作:
SEG1 SEGMENT ORG 10 VAR1 DW 1234H ORG 20 VAR2 DW 5678H ORG $+8 VAR3 DW 1357H ENDS LABEL ORG BUFFER ORG …… BYTE $+8 DB 8 DUP (?)
24
(2) 逻辑和移位操作符: AND、OR、XOR、NOT、
SHL、SHR OPR1 OPR2 EQU EQU AND AX, 25 7 AX, OPR1 AND OPR2 0FFFFH SHL 2
; AND AX,1
MOV
; MOV AX,0FFFCH
IN OUT
AL, PORT_VAL PORT_VAL AND 0FEH, AL
; 定义代码段 ds:data, es:extra
PSP
start:
; 段地址 段寄存器
code
start
EXE程序的内存映象图
5
…… code main
segment proc far assume …… start: push ds mov ax, 0 push ax …… ret main endp code ends end start
(2) 简化的段定义伪操作
.code [name] .data .data? .fardata [name] .fardata? [name] .const .stack [size]
8
.model small .data …… .code .startup …… .exit 0 end .model small .const …… .data …… .code start: mov ax, DGROUP mov ds, ax …… mov ax, 4c00h int 21h end start
100
start: mov ax, datagroup mov ds, ax mov ax, const1 mov var1, ax mov bx, offset var1 mov bx, offset data1 mov bx, offset data2 assume ds:data2 mov ax, data2 mov ds, ax mov ax, var1 mov bx, offset var1 mov ax, 4c00h int 21h code ends end start
× ×
类型不匹配
OPER1+1 OPER2
(AX)=3402H
(AL)=34H
16
LABEL 伪操作: name
LABEL
type
BYTE_ARRAY WORD_ARRAY
BYTE_ARRAY WORD_ARRAY tos
LABEL DW 50
BYTE DUP (?) WORD
tos
50字