第四章 汇编语言程序格式

合集下载

汇编语言程序设计第四章-汇编语言程序格式

汇编语言程序设计第四章-汇编语言程序格式

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章 汇编语言程序格式

第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章 汇编语言程序格式

第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章汇编语言程序格式

第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章 汇编语言程序格式

第4章 汇编语言程序格式
.MODEL 存储模式 [,语言类型] [,操作系统类型] [,堆栈选项] 所有数据和代码都放在一个段 所有数据和代码各放在一个段 .com(0100H) 存储模式:tiny small
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 ;定义存储模式
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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字
相关文档
最新文档