第三章+汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
名字
汇编语言的一个实例: hello.asm data SEGMENT Hello DB ‘Hello, world!’,0DH,0AH,’$’ data ENDS prog SEGMENT ASSUME CS:prog,DS:data
start: MOV AX,data
MOV LEA MOV INT MOV INT ENDS END DS,AX DX,hello AH,9 21H AH,4CH 21H ;取字符串首地址
3.2
汇编语言源程序的格式
3.2.1 分段结构
汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三 个逻辑段组成: 数据段——存放数据、变量 DATA SEGMENT DATA ENDS
堆栈段——堆栈区域
STACK SEGMENT STACK ENDS CODE SEGMENT CODE ENDS
23
3.3 伪操作命令
由汇编程序执行的指令,它本身不被汇编成机器指令。 常用的伪指令有: • • • • • 数据定义伪指令 符号定义伪指令 段定义和段寄存器指定伪指令 过程定义伪指令 结束伪指令
24
3.3.2 数据定义伪指令
① OFFSET:取变量/标号的偏移地址 MOV BX, OFFSET VAR LEA ② BX, VAR OFFSET只能取静态的偏移地址; LEA指令即可取静态的偏移地址,也可取动态的偏移地址。 SEG:取变量/标号的段地址。
注意,以下指令的异同:
例:MOV AX, SEG
DATA
MOV DS,AX
13
十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。
字符串:用引号括起来的1个或多个字符。如‘ERROR!’, ’a’,汇编时被
翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H和61H。 十进制科学计数法。如:8.75E-4 十六进制实数。如:10A4E87R
格式:<类型> PTR <地址操作数>
例:MOV
20
PTR也可用来进行强制类型转换 例:STR1 DW MOV MOV MOV ⑦ ? ;STR1定义为字类型 ;合法 ;非法 AX,STR1 AL,STR1
AL, BYTE PTR STR1 ;合法
合成运算符THIS:用来指定存储器操作数的类型
⑧
合成运算符SHORT:地址操作数
例:LOOPER: MOV AL,DATA[SI]
9
• 汇编语言的语句有两种:
指示性语句——由伪指令构成的语句
指示性语句的格式为:
名字 伪指令 操作数1,操作数2,„,操作数n
注:各部分之间至少要用一个空格作为分隔符。
;注释
指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编, 如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无 机器码指令与其相对应。
ADC DATA1[SI],AL INC SI
;取一个字节加数
;与被加数相加,带进位加法 ;SI加1
DEC
JNZ MOV
CX
LOOPER AH,4CH
;CX减1
;若(CX)不等于0,转LOOPER
INT
CODE ENDS END
21H
START
;返回DOS
;代码段结束 ;源程序结束
注:MOV AH,4CH INT 21H ;DOS功能调用,结束正在运行的程序,返回DOS
22
3.2.6 注释
• 注释——以分号开头,可放在指令后,也可单独一行。 注意注解的写法。要写指令(段)在程序中的作用,而不要写指令 的操作。
例如:以下为同一条指令写的注释 1)MOV CX,100 2)MOV CX,100 ;传送100到CX ;循环计数器置初值
显然,第二种写法要比第一种写法要好。
code
MOV AH, 4CH INT 21H ENDS END start
<此处加入你自己的程序段>
代码段
6
例:将两个五字节的16进制数相加
DATA SEGMENT ;定义数据段 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;变量一,字节
DATA2 DB
DATA CODE
0C1H,36H,93H,0D5H,20H ;变量二,字节
标号
;显示字符串
;退回DOS
prog
start
12
3.2.4 助记符和伪操作
助记符:8086、8088CPU指令的助记符,例如:MOV, ADD,MUL等 伪操作指令:如DB、SEGMENT、ENDS、ASSUME、ENDS
3.2.5 操作数
操作数包括常量、寄存器、标号、变量及表达式。 1.常量 二进制数,以B结尾。如01001101B。 十进制数,如85。 八进制数,以Q结尾。如174Q。
;取变量DATA的段地址
18
③ VAR
TYPE DW DD
取变量的类型(1,2,4) ? 10DUP(?) ;字 ;双字
ARRAY
STR
DB
…… MOV
‘This is a test’
AX,TYPE VAR
;字节
;(AX)=2
MOV
MOV
BX, TYPE ARRAY
CX, TYPE STR
;(BX)=4
(3)关系运算符——EQ、NE、LT、GT、LE、GE
关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1; 关系为假,结果为全0 例: MOV BX,PORT GT 300H 若PORT的值大于300H,则汇编后为:MOV BX,0FFFFH 否则汇编后为: MOV BX,0
17
(4)分析运算符和合成运算符
2
LP1: mov
ax,VAR
…
loop LP1 汇编语言——指令助记符,符号地址,标号,伪指令等语言元素的集合 以及这些元素使用的规则。 用汇编语言编写的程序叫汇编语言源程序。 汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻 译过程叫汇编。——高级语言中称该过程为“解释”或“编译”。执行 翻译的程序称为“汇编程序”。
;数据段结束 ;定义代码段
ENDS SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,0 CLC ;初始化DS ;置循环次数送CX ;(SI)=0 ;(CF)=0
Байду номын сангаас
7
LOOPER: MOV AL,DATA2[SI]
指示性语句汇编时不生成机器码。
例:DATA DB 0FBH,60H
10
3.2.3 名字
标号有三个属性: 段地址:即标号所在段的段地址; 程序中引用一个标号,该标号的段地址应在CS中。
偏移量:标号所代表存储单元的段内偏移地址;16位的无符号数
类 型:NEAR或FAR: NEAR—表示标号所在语句与转移指令/调用指令在同一码段内, 跳转时只需改变IP即可。 FAR—标号所在语句与转移指令/调用指令不在同一代码段内。 若没有对类型进行说明,默认为NEAR。 标号通常作为转移指令或CALL指令的转移地址。
16
(2)逻辑运算符—— AND、OR、XOR、NOT
逻辑运算符只能用于数字表达式中。 例:MOV CL,36H AND 0FH 经汇编后:MOV CL,06H 注意,不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX, 3F00H等价。
汇编语言源程序
汇编程序 机器语言目标程序
源程序的编译程序
3
汇编语言程序设计与执行过程
• 输入汇编语言源程序
• 汇编(编译) • 链接 • 调试
源文件 .ASM
目标文件 .OBJ 可执行文件 .EXE 最终程序
小汇编:ASM
宏汇编:MASM
3、高级语言:通用性强。例:MATLAB、C、Pascal
4
代码段——存放程序指令
5
• 一个基本的汇编语言程序框架如下:
stack stack data data code
SEGMENT PARA ‘stack‘ DB 100 DUP(‘stack’) ENDS SEGMENT ENDS 堆栈段
<数据、变量在此定义>
数据段
SEGMENT ASSUME CS:code, DS:data, ES:data start: MOV AX, data MOV DS, AX MOV ES, AX
8
3.2.2 汇编语言语句的类型和组成
• 汇编语言的语句有两种: 指令性语句——由8086指令助记符构成的语句 • 指令性语句的格式为:
标号: 指令助记符 目的操作数,源操作数 ;注释
注:各部分之间至少要用一个空格作为分隔符。
指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应
指令性语句汇编时生成机器码;
2、寄存器
8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL 16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP、DS、CS、SS、DS
3、标号:代表一条指令的符号地址
14
4.变量---即内存中的存储单元或数据区。
变量名——是存储单元(数据区)的符号地址或名字。 变量也有三个属性: 段地址—变量所在段的段地址 偏移量—变量单元地址与段首地址之间的位移量。 类 型—有BYTE、WORD和DWORD三种。 变量在程序中作为存储器操作数被引用。 •标号和变量名的使用规则 – 组成:A-Z(不分大小写), 0-9, ?@ . _ $ – 不能以数字开头 – 长度小于31个字符 – 不能与保留字(指令助记符、伪指令、预定义符号等)重名 – 不能重复定义 例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #HELP, +ONE
;(CX)=1
④
LENGTH 取所定义变量的长度(即变量中元素的个数) 未使用重复操作符DUP,变量个数为1; 否则如上例中的变量ARRAY的个数为10;
19
⑤ SIZE 例:VAR DW
取所定义存储区的字节数(=TYPE*LENGTH) 1,2,3,4,5
则 TYPE VAR = 2,LENGTH VAR = 5,SIZE VAR = 10
⑥ 合成运算符PTR:用来指定地址操作数的类型 类型∈{BYTE, WORD, DWORD, NEAR, FAR} • • BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址 NEAR、FAR 用于描述转移、调用的目的地址 BYTE PTR[DI],0 ;字节类型 WORD PTR[DI],0 ;字类型 [DI],0B5H ;类型不定 MOV MOV
21
(5)其他运算符
① 方括号[]:存储器地址 MOV CL,[BX] ;间址寻址 MOV AL,[SI+5] ;变址寻址 ② 段超越运算符: MOV AX,ES:[DI] ③ HIGH、LOW:获取数值或地址表达式的高位和低位字节 VAR EQU 0ABCDH MOV AH,HIGH VAR ; (AH)=0ABH MOV AL,LOW VAR ; (AL)=0CDH
第3章 汇编语言程序设计
主要内容:
汇编语言源程序的结构
汇编语言语句格式
伪指令
功能调用 汇编语言程序设计
1
3.1
汇编语言概述
1、机器语言——二进制数形式的指令和数据。
B0 64 是什么意思?这就是机器语言。既不直观,又不易理解和记忆. 2、汇编语言---- MOV AL,64H ;很容易记忆理解,这就是助记符。 助记符——用便于记忆的英语单词表示的指令操作码。它反映了指令 的功能和主要特征,便于人们理解和记忆。 指令除了操作码以外,还有一个操作数问题。 操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移 指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有 错,改动也很麻烦。于是人们采用标号或符号来代替地址。
15
5.表达式
表达式是常数、寄存器、标号、变量与运算符的组合。 有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运 行时不能改变。 表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。
(1)算术运算符—— +、-、*、/,MOD
用于数字表达式,例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式,例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为:LEA SI,1003H