2009-7-31 1
微机原理及应用第 4章 汇编程序微机原理及应用 —— 第4章 汇编语言 2
第 4章 指令系统主要内容学习目的知识点重点难点微机原理及应用 —— 第4章 汇编语言 3
汇编语言格式;
主要内容汇编语言语句;2
1
3 汇编程序;
微机原理及应用 —— 第4章 汇编语言 4
1.掌握汇编语言的格式 ;
2.熟练汇编语言编程;
学习目的微机原理及应用 —— 第4章 汇编语言 5
4,1 汇编语言源程序格式语法
机器语言,机器能识别并执行,称目标程序,是二进制码。
汇编语言 ( Assemble Language),用指令助记符、
符号地址、标号等书写的语言。
汇编语言源程序,用汇编语言编写的程序。
汇编,汇编语言源程序?目标程序微机原理及应用 —— 第4章 汇编语言 6
4.1 汇编语言源程序机器语言 —— 二进制数形式的指令和数据。
B0 64 是什么意思?这就是机器语言。既不直观,
又不易理解和记忆,
MOV AL,64H ; 很容易记忆理解,这就是 助记符 。
助记符 —— 用便于记忆的英语单词表示的指令操作码。
它反映了指令的功能和主要特征,便于人们理解和记忆。
微机原理及应用 —— 第4章 汇编语言 7
4,1 汇编语言源程序格式语法操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,
改动也很麻烦。于是人们 采用标号或符号来代替地址,例:
LP1,mov ax,VAR
…
loop LP1
汇编语言 —— 指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则 。
用汇编语言编写的程序叫 汇编语言源程序 。
指令除了操作码以外,还有一个操作数问题。
微机原理及应用 —— 第4章 汇编语言 8
4,1 汇编语言源程序格式语法汇编语言程序设计与执行过程
输入汇编语言源程序 源文件,ASM
汇编(编译) 目标文件,OBJ
链接 可执行文件,EXE
调试 最终程序微机原理及应用 —— 第4章 汇编语言 9
4.1.1 汇编语言源程序的结构汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:
数据段 —— 存放数据、变量堆栈段 —— 堆栈区域代码段 —— 存放程序指令微机原理及应用 —— 第4章 汇编语言 10
4,1 汇编语言源程序格式语法
一个基本的汇编语言程序框架如下:
stack SEGMENT PARA ‘stack‘
DB 100 DUP(‘stack’)
stack ENDS
data SEGMENT
<数据、变量在此定义 >
data ENDS
code SEGMENT
ASSUME CS:code,DS:data,ES:data
start,MOV AX,data
MOV DS,AX
MOV ES,AX
<此处加入你自己的程序段 >
MOV AL,4CH
INT 21H
code ENDS
END start
微机原理及应用 —— 第4章 汇编语言 11
4.1.2 汇编语言的语句与格式
汇编语言的语句有两种:
指令性语句 —— 由 8086指令助记符构成的语句指示性语句 —— 由伪指令构成的语句
指令性语句 的格式为:
标号,指令助记符 目的操作数,源操作数 ;注释
指示性语句 的格式为:
名字 伪指令 操作数 1,操作数 2,…,操作数 n ;注释注,各部分之间至少要用一个空格作为分隔符。
微机原理及应用 —— 第4章 汇编语言 12
4.1.2 汇编语言的语句与格式
● 指令性语句 由 CPU执行,每一条指令性语句都有一条机器码指令与其对应 ;
● 指示性语句 由 汇编程序 执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。
指令性语句汇编时 生成 机器码;
指示性语句汇编时 不生成 机器码。
微机原理及应用 —— 第4章 汇编语言 13
4.1.2 汇编语言的语句与格式语句的构成元素:
标号 —— 指令的符号地址,用来代表指令在存储器中的地址。
只能出现在指令性语句中,标号后应加上冒号。
名字 —— 段、过程、变量的名字,用来代表它们在存储器中的地址。 只能出现在指示性语句中,名字后不加冒号 。
指令助记符 —— 8086助记符、伪指令
操作数 —— 即指令的操作对象
对指令性语句 —— 0,1,2个
对指示性语句 —— 根据需要而定
操作数之间以逗号分隔
操作数可以是,寄存器、存储单元、常数或表达式例如,AX,[DI+BX+10],200,16*8+TABLE,等等微机原理及应用 —— 第4章 汇编语言 14
4.1.2 汇编语言的语句与格式
注释 —— 以分号开头,可放在指令后,也可单独一行。
注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。
例如:以下为同一条指令写的注释
1) MOV CX,100 ;传送 100到 CX
2) MOV CX,100 ;循环计数器置初值显然,第二种写法要比第一种写法要好。
微机原理及应用 —— 第4章 汇编语言 15
汇编语言的一个实例,hello.asm
data SEGMENT
Hello DB ‘Hello,world!’,0DH,0AH,’$’
data ENDS
prog SEGMENT
ASSUME CS:prog,DS:data
start,MOV AX,data
MOV DS,AX
LEA DX,hello ;取字符串首地址
MOV AH,9
INT 21H ;显示字符串
MOV AH,4CH
INT 21H ;退回 DOS
prog ENDS
END start
名字标号微机原理及应用 —— 第4章 汇编语言 16
4.1.3 数据项与表达式数据项包括 常量,变量,标号 及 表达式 。
1.常量
二进制数,以 B结尾。如 01001101B。
十进制数,如 85。
十六进制数,以 H结尾 。 第 1个数字为 A-F时,前面应加 0,如 0F160H。
字符串:用引号括起来的 1个或多个字符 。 如
‘ ERROR!’,’a’,汇编时被翻译成对应的 ASCII
码 45H,52H,52H,4FH,52H,21H和 61H。
微机原理及应用 —— 第4章 汇编语言 17
4.1.3 数据项与表达式
有三个属性:
段地址,即标号所在段的段地址;
偏移量,标号所代表存储单元的段内偏移地址;
类 型,NEAR或 FAR:
NEAR— 表示标号所在语句与转移指令 /
调用指令在同一码段内,跳转时只需改变 IP即可。
FAR— 标号所在语句与转移指令 /调用指令不在同一代码段内。
若没有对类型进行说明,默认为 NEAR。
标号通常作为 转移指令 或 CALL指令 的转移地址。
2.标号 —— 指令所在内存单元的符号地址微机原理及应用 —— 第4章 汇编语言 18
4.1.3 数据项与表达式变量 —— 即内存中的存储单元或数据区。
变量名 —— 是存储单元 (数据区 )的符号地址或名字。
变量也有三个属性,
段地址 — 变量所在段的段地址
偏移量 — 变量单元地址与段首地址之间的位移量。
类 型 — 有 BYTE,WORD和 DWORD三种 。
变量在程序中作为 存储器操作数 被引用。
3.变量微机原理及应用 —— 第4章 汇编语言 19
4.1.3 数据项与表达式
标号和变量名的使用规则
组成,A-Z(不分大小写 ),0-9,? @,_ $
不能以数字开头,句号 (.)只能作为首字符
长度小于 31个字符
不能与保留字 (指令助记符、伪指令、预定义符号等 )重名
不能重复定义例如:
正确的,LP1,AGAIN,NEXT,_GO,OK_1
错误的,4M,LOOP,AAA,#HELP,+ONE
微机原理及应用 —— 第4章 汇编语言 20
4.1.3 数据项与表达式
4.表达式
表达式是常数、寄存器、标号、变量与运算符的组合。
有数字表达式和地址表达式两种。
汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。
表达式中的运算符有 6类:算术、逻辑、关系、取地址、属性、杂类。
微机原理及应用 —— 第4章 汇编语言 21
4.1.3 数据项与表达式
用于数字表达式,例:
MOV AX,4*1024
汇编后的形式为,
MOV AX,4096
用于地址表达式,例,
LEA SI,TAB+3
若 TAB的偏移地址为 1000H,则汇编后的形式为:
LEA SI,[1003H]
1)算术运算符 —— +,-,*,/,MOD
微机原理及应用 —— 第4章 汇编语言 22
4.1.3 数据项与表达式逻辑运算符只能用于数字表达式中。
例,MOV CL,36H AND 0FH
经汇编后,MOV CL,06H
注意,不要把逻辑运算符与逻辑运算指令混淆:
例,AND AX,3FC0H AND 0FF00H
汇编后源操作数被翻译为,3F00H,所以上述指令与
AND AX,3F00H等价。
2)逻辑运算符 —— AND,OR,XOR,NOT
微机原理及应用 —— 第4章 汇编语言 23
4.1.3 数据项与表达式
关系运算的结果是一个逻辑值,真 或 假关系为真,结果为全 1
关系为假,结果为全 0
例,MOV BX,PORT GT 300H
若 PORT的值大于 300H,则汇编后为:
MOV BX,0FFFFH
否则汇编后为:
MOV BX,0
3)关系运算符 —— EQ,NE,LT,GT,LE,GE
微机原理及应用 —— 第4章 汇编语言 24
4.1.3 数据项与表达式
SEG:取变量 /标号的段地址
OFFSET:取变量 /标号的偏移地址例,VAR DB 12H
……
MOV BX,OFFSET VAR ;取变量 VAR的偏移地址
MOV AX,SEG VAR ;取变量 VAR的段地址注意,以下指令的异同:
MOV BX,OFFSET VAR
LEA BX,VAR
OFFSET只能取静态的偏移地址;
LEA指令即可取静态的偏移地址,也可取动态的偏移地址。
4)取地址运算符 —— SEG,OFFSET
微机原理及应用 —— 第4章 汇编语言 25
4.1.3 数据项与表达式
TYPE 取变量的类型( 1,2,4)
LENGTH 取所定义变量的长度
(即变量中元素的个数)
SIZE 取所定义存储区的字节数
( =TYPE*LENGTH)
例,VAR DW 1,2,3,4,5
则 TYPE VAR = 2
LENGTH VAR = 5
SIZE VAR = 10
5)取值运算符 —— TYPE,LENGTH,SIZE
微机原理及应用 —— 第4章 汇编语言 26
4.1.3 数据项与表达式
6)属性运算符 —— PTR
用来指定地址操作数的类型。
格式,<类型 > PTR <地址操作数 >
类型 ∈ {BYTE,WORD,DWORD,NEAR,FAR}
BYTE,WORD,DWORD
用于描述数据存储单元 (变量 )地址
NEAR,FAR
用于描述转移、调用的目的地址微机原理及应用 —— 第4章 汇编语言 27
4.1.3 数据项与表达式例,MOV BYTE PTR[DI],0 ;字节类型
MOV WORD PTR[DI],0 ;字类型
MOV [DI],0B5H ;类型不定
PTR也可用来进行强制类型转换例,STR1 DW? ;STR1定义为字类型
MOV AX,STR1 ;合法
MOV AL,STR1 ;非法
MOV AL,BYTE PTR STR1 ;合法微机原理及应用 —— 第4章 汇编语言 28
4.2 指示性语句-伪指令
数据定义伪指令
符号定义伪指令
段定义和段寄存器指定伪指令
过程定义伪指令
结束伪指令由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:
微机原理及应用 —— 第4章 汇编语言 29
用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:
变量名 数据定义伪指令 操作数,操作数,…
常用的数据定义伪指令有如下几种:
DB 定义 字节
DW 定义 字
DD 定义 双字
操作数可以是常数、变量或表达式
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 30
例 1:
DATA_B DB 10,5,10H
DATA_W DW 100H,-4
DATA_D DD 0FFFBH
汇编后的内存分配情况如右图所示。
05H
10H
00H
01H
FCH
FFH
FBH
FFH
00H
00H
0AHDATA_B
DATA_W
DATA_D
10
5
10H
100H
-4
0FFFBH
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 31
例 2:操作数可以是字符串,例如
STR DB ‘HELLO’
汇编后的情况如图,STR ‘
H’‘
E’‘ L’
‘ L’
‘
O’
48H
45H
4CH
4CH
4FH
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 32
操作数?用来保留存储空间,但不存入数据,
例 3,ABC DB 0,1,2,3,4,’OK’,’$’
RSV DW?,?,?,?,?,?,?,?
复制操作符 DUP:
重复的数据可以使用复制操作符 DUP,如上面
RSV亦可写成,
RSV DW 8 DUP(?)
若操作数中若使用 $,则表示的是地址计数器的当前值。
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 33
例,TABLE DB 10 DUP(?)
BUFFER DW TABLE,$+3
设 TABLE的偏移地址为 0080H,则汇编后如下图所示:
BUFFER
0080H
80H
TABLE
008AH
008BH
008CH
008DH
...
8FH
00H
00H
0089H
10 Bytes
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 34
把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于 C语言中的 #define。
符号定义伪指令 有两种,EQU,=
用 EQU定义的符号未清除前,不能重新定义。
清除 EQU定义可用 PURGE伪指令。
用,=”定义的符号可在任何时候进行重定义。
二者 均不占用存储空间,仅是给符号赋值
4.2.2 符号定义伪指令微机原理及应用 —— 第4章 汇编语言 35
例,FIVE EQU 5
COUNT EQU CX
TEN EQU 10
DIST = BYTE PTR[SI+BP]
GOTO = JMP
…
MOV AX,TEN
MOV CX,COUNT
ADD DIST,FIVE
DIST = WORD PTR[SI+BP+1]
ADD DIST,AX
GOTO LABEL
定义引用
4.2.2 符号定义伪指令微机原理及应用 —— 第4章 汇编语言 36
汇编语言程序是按段来组织程序和数据的。
和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。
三类段:代码 (程序 )、数据、堆栈
段定义伪指令,SEGMENT,ENDS,ASSUME,ORG
定义一个段的基本格式:
段名 SEGMENT [定位类型 ][组合方式 ][类别 ]
<汇编语言语句 >
段名 ENDS
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 37
这两个伪指令总是成对出现,二者前面的段名应一致。 SEGMENT说明了一个段的开始,
ENDS说明了一个段的结束。
对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。
如,data SEGMENT
<指令语句 >
data ENDS
SEGMENT和 ENDS伪指令
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 38
ASSUME伪指令
在代码段中,还必须明确段和段寄存器的关系,
这由 ASSUME语句来指定。如
ASSUME CS:code,DS:data,ES:data
语句中的 code和 data为段名。
这个语句说明:
1,CS将指向名字为 code的代码段
2,DS和 ES将指向名字为 data的数据段
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 39
但要注意,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句
MOV AX,DATA
MOV DS,AX
MOV ES,AX
将段基址装入段寄存器 。如果程序中用到堆栈段,则 SS也需装入实际的初值。
代码段基地址 不需要程序员装入 CS寄存器,
而由 OS负责装入 。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 40
SEGMENT语句后可以带有可选参数,用以 规定逻辑段的其他一些 属性 。
1) 定位类型说明 如何确定逻辑段的边界。有四种:
PARA(Paragraph),逻辑段从一个节 (16个字节 ) 的边界开始。 即 段的起始地址应能被 16整除,或这说段 起始物理地址应为 ×××× 0H。 —— 默认类型
BYTE,逻辑段从字节边界开始,即段可以从任何地址开始。
WORD,逻辑段从字边界开始。即段的起始地址必须是偶数。
PAGE,逻辑段从页边界开始。 256字节称为一页,故段的起始物理地址应为××× 00H。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 41
2) 组合类型说明不同模块中同名段的组合方式。
PUBLIC,所有此类型的 同名段 组合成一个逻辑段,
公用一个段地址,运行时装入同一个物理段中。
COMMON,所有此类型的同名段具有相同的起始地址 (但是会覆盖 ),共享相同的存储区域。
AT <数值表达式 >,按绝对地址定位,段地址就是表达式的值。
STACK,专用于说明堆栈段,组合方式同 PUBLIC
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 42
3) 类别用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。
如:在模块 1中有段定义:
seg1 SEGMENT PARA STACK ‘stack’
…
seg1 ENDS
在模块 2中有段定义:
seg2 SEGMENT PARA STACK ‘stack’
…
seg2 ENDS
则连接时这两个段被安排在一起。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 43
ORG规定了段内的指令或数据存放的开始地址 (偏移地址的初值 ),其格式为:
ORG <表达式 >
表达式的值即为开始地址,从此地址起连续存放程序或数据 。
例,ABC SEGMENT
ORG 100H
begin,…
…
ABC ENDS
ORG伪指令指令从 100H
开始存放
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 44
过程就是子程序。一个过程可以被其它程序所调用
(用 CALL指令 ),过程的最后一条指令一般是返回指令
(RET)。
过程定义伪指令的格式为
<过程名 > PROC [类型 ]
…
…
RET
<过程名 > ENDP
注意,PROC和 ENDP必须成对出现 。
4.2.4 过程定义伪指令微机原理及应用 —— 第4章 汇编语言 45
过程的类型有两种:
NEAR—— (默认类型 )表示段内调用
FAR—— 表示段间调用调用一个过程的格式为:
CALL <过程名 >
4.2.4 过程定义伪指令微机原理及应用 —— 第4章 汇编语言 46
如果需要多次使用同一个程序段,可以将这个程序段定义为一个,宏 指令”,
然后 在 需要时,可简单地用 宏指令名 来代替这个程序段。
指令的格式为:
<宏指令名 > MACRO [形参表 ]
<宏定义体 >
ENDM
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 47
例,两个数之和的宏定义和宏调用 。
宏定义为:
DADD MACRO X,Y,Z
MOV AX,X
ADD AX,Y
MOV Z,AX
ENDM
X,Y,Z是形式参数。调用宏 DADD时可写为:
DADD DATA1,DATA2,SUM
DATA1,DATA2,SUM是实际参数,由 它们替换定义中的 X,Y,Z。
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 48
宏调用与过程 (子程序 )调用 都是一次定义,多次调用 。 它们之间的差别是:
① 执行形式,宏命令伪指令由宏汇编程序 在汇编过理中进行处理,而 CALL,RET则是 由 CPU执行的指令 。
② 汇编结果,宏命令伪指令 汇编后被展开。
③ 执行速度,宏命令 执行速度较快 (因无调用转移 )
④ 占用内存,宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。 使用过程可以节省代码占用的内存空间。
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 49
宏展开:汇编程序会把宏调用按宏定义展开。
例如:宏定义为:
Display MACRO string
LEA DX,string
MOV AH,9
INT 21H
ENDM
程序中宏调用:
……
DISPLAY ERROR_MESSAGE
DISPLAY EXIT_MESSAGE
……
汇编后的结果,(带有 +号的指令为宏展开后的结果 )
……
+ LEA DX,ERROR_MESSAGE
+ MOV AH,9
+ INT 21H
+ LEA DX,EXIT_MESSAGE
+ MOV AH,9
+ INT 21H
……
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 50
汇编语言源程序的最后,要加 汇编结束伪指令 END,以使汇编程序结束汇编。
格式,END [表达式 ]
END后跟的表达式通常就是 程序第一条指令的标号,指示程序的启动地址 (要执行的第一条指令的地址 )。
4.2.6 汇编结束伪指令 END
微机原理及应用 —— 第4章 汇编语言 51
系统功能调用 —— 由 OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。
系统功能调用有两种,一种称为 DOS功能调用,另一种称为 BIOS功能调用。
用户程序在调用这些系统服务程序时,不是用 CALL
命令,而是采用软中断指令 INT n来实现。
在 DOS系统 中,常用功能调用一般都是用软中断指令
INT 21H来实现的。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 52
INT 2lH功能大致可以分为四个方面:
设备管理、目录管理、文件管理和其它。
D0S系统功能调用的使用方法如下:
① AH← 功能号 ;
② 设置该功能所要求的其他入口参数;
③ 执行 INT 21H指令;
④ 分析出口参数 。
以下 介绍 INT 21H的几个最常用的功能 。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 53
关于数据输入和输出我们这里只讨论键盘输入 和 显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。
1,DOS键盘功能调用
(1) 从键盘输入一个字符 (功能号 =1)
MOV AH,1
INT 21H
<AL中有键入的字符 >
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 54
例,程序中有时需要用户对提示做出应答。
GET_KEY,MOV AH,1 ;等待键入字符
INT 21H ;结果在 AL中
CMP AL,’Y’ ;是 ’ Y’?
JZ YES ;是,转 YES
CMP AL,’N’ ;是 ’ N’?
JZ NO ;是,转 NO
JMP GET_KEY ;否则继续等待输入
YES,…
…
NO,…
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 55
(2) 输入字符串 (功能号 =0AH)
此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。
MOV AH,0AH
LEA DX,<字符串缓冲区首地址 >
INT 21H
(预留的 N1个字节的存储单元 ) 0DHN2N1
N1,缓冲区长度 (最大键入字符数 )
N2,实际键入的字符数 (不包括回车符 )
用户定义的输入字符串的缓冲区格式
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 56
若用户键入的字符数 (包括回车 )≥ 定义的 N1,
本功能调用将不再接收新的键入,且光标不再向右移动。
例:设在数据段定义键盘缓冲区如下:
STR1 DB 10,?,10 DUP(?)
调用 DOS功能的 0AH号功能的程序段为:
LEA DX,STR1
MOV AH,0AH
INT 21H
此程序段最多从键盘接收 10个按键(包括回车)。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 57
2,DOS显示功能调用
(1) 在显示器上显示一个字符 (功能号 =2)
MOV AH,2
MOV DL,<要显示的字符 >
INT 21H
例:在显示器上显示一个字符 ‘ A’
MOV AH,2
MOV DL,’A’ ;或 MOV DL,41H
INT 21H
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 58
MOV AH,9
LEA DX,<字符串 >
INT 21H
注意:被显示的字符串必须以 ’ $’ 结束 。
(2)显示字符串 (功能号 =9)
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 59
例,在屏幕上显示,’ HELLO,WORLD!’
在数据段定义字符串:
DATA SEGMENT
STR1 DB ‘HELLO,WORLD!$’
DATA ENDS
在代码段中进行显示输出
MOV AH,9
LEA DX,STR1
INT 21H
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 60
附,BIOS功能调用
BIOS:基本输入输出系统,是固化在 EPROM中的一组实现基本输入输出功能的子程序。
BIOS调用通过多个软中断提供,调用方法为,
MOV AH,<功能号 >
<设置入口参数,一般将参数放在寄存器中 >
INT <中断类型 >
BIOS中的几个主要中断类型如下:
INT 10H—— 屏幕显示
INT 13H—— 磁盘操作
INT 14H—— 串行口操作
INT 16H—— 键盘操作
INT 17H—— 打印机操作每类中断由包含许多子功能,调用时通过功能号指定。
微机原理及应用 —— 第4章 汇编语言 61
4.3.1宏伪指令补充
(1) LOCAL
宏定义体内允许使用标号。例如,在 AL中有 1位十六进制数码要转换为 ASCII码,则可以用以下宏定义:
CHANGE MACRO
CMP AL,10
JL ADD_0
ADD AL,′A′-′0′-10
ADD_0,ADD AL,′0′
ENDM
微机原理及应用 —— 第4章 汇编语言 62
若在一个程序中多次使用这条宏指令,则在汇编展开时,标号 ADD_0就会出现重复定义的错误,这是不允许的。
CHANGE MACRO
LOCAL ADD_0
CMP AL,10
JL ADD_0
ADD AL,′A′-′0′-10
ADD_0 ADD AL,′0′
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 63
REPT
这个伪指令可以重复执行在它的指令体部分所包含的语句。重复执行的次数,由表达式的值所决定。
REPT 〈 表达式 〉
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 64
例,把 1~ 10分配给十个连续的存储单元。
Address MACRO
X = 0
REPT 10
X = X+1
DB X
ENDM
利用这个伪指令可以对某个存储区赋值 (建立一个表 )。
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 65
IRP
此伪指令能重复执行指令体部分所包含的语句,
重复的次数由参数表中参数的个数所决定参数表中的参数必须用两个尖括号括起来,参数间用逗号分隔 )
每重复一次按次序用参数表中的参数代替形式参量
IRP 形式参量 (参数表 )
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 66
例:把 1到 10分配给 10个连续的存储单元。
Address_1 MACRO
IRP X〈 1,2,3,4,5,6,7,8,9,10〉
DB X
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 67
IRPC
此伪指令能重复执行指令体部分所包含的语句,
重复的次数由参数表 字符串 中 字符 的个数所决定
参数表中的参数也用两个尖括号括起来
每重复一次按次序用参数表中的 字符 代替形式参量
IRPC 形式参量 (参数表 )
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 68
例:把 1到 10分配给 10个连续的存储单元。
Address_1 MACRO
IRPC X,0123456789
DB X+1
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 69
汇编语言程序设计的步骤:
1-根据实际问题抽象出数学模型,确定算法
2-画出程序框图 (流程图 )
3-分配内存工作单元和寄存器
4-根据框图编写源程序,存成,ASM文件
5-对源程序汇编,生成,OBJ目标文件
6-把,OBJ文件连接成,EXE执行文件
7-运行,调试源程序的基本结构,顺序,分支,循环,过程
4.4 汇编语言程序设计基础微机原理及应用 —— 第4章 汇编语言 70
(1)用方框表示工作框,框中用简明语言标明要完成的功能
(2) 用菱形框表示判断框框中标明比较、判断和条件如何绘制程序框图 (流程图 )?
N
Y
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 71
(4)各框之间用直线连起来表示程序走向。
框中标明 子程序名字 (入口参数等 )
(3)用 框表示调用子程序或过程 。
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 72
汇编语言上机过程
Y
Y
Y
N
N
N
有错?
有错?
有错?
结束汇 编输入 (修改 )源程序连 接运 行查 错开始用 EDIT,NOTEPAD等任何文本编辑器。源程序存为,ASM文件用 MASM宏汇编程序进行汇编。
汇编后生成,OBJ目标文件。
命令格式,MASM <源文件名,ASM>;
用 LINK连接程序进行连接。
连接后生成,EXE可执行文件。
命令格式,LINK <目标文件名,OBJ>;
用 TD,DEBUG等调试程序进行调试。
命令格式,TD <可执行文件名,EXE>
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 73
标号,
条件满足
?
处理
N
Y
IF…THEN 结构程序结构:
…
测试 /比较指令 (TEST/CMP)
条件转移指令 (Jx 标号 )
处理体标号,其他指令
…
4.4.2 分支程序微机原理及应用 —— 第4章 汇编语言 74
程序结构:
TEST/CMP指令
Jx 标号 1
处理体 P1
JMP 标号 2
标号 1:
处理体 P2
标号 2:其他指令
…
条件满足
?
处理 P1 处理 P2
标号 1:
标号 2:
条件 1 条件 2
IF…THEN…ELSE 结构
4.4.2 分支程序微机原理及应用 —— 第4章 汇编语言 75
4.4.3 循环程序
1,DO…UNTIL< 条件 > 结构先执行,再判断条件。工作部分至少执行一次。
初始化循环体循环控制继续循环? Y
N
微机原理及应用 —— 第4章 汇编语言 76
2,DO WHILE<条件 > 结构先判断条件,再执行。工作部分有可能一次都不执行。
初始化循环体循环控制继续循环? Y
N
4.4.3 循环程序微机原理及应用 —— 第4章 汇编语言 77
注意:循环可以嵌套 (多重循环 ),但多个循环体之间不能交叉,控制条件不能混淆。
内外两层循环;
外循环用于控制有多少轮内循环。
4.4.3 循环程序微机原理及应用 —— 第4章 汇编语言 78
掌握以下几点,
调用子程序用 CALL指令,返回调用程序用 RET指令 。
子程序允许嵌套调用 。
进入子程序后首先要保护主程序的运行状态 (标志位 )和使用的寄存器内容 (称为 保护现场 ),退出子程序前要 恢复现场 。
调用前要预先确定子程序中要 使用哪些寄存器,
并 定义入口参数和出口参数 。 参数传递可利用寄存器,存储单元或堆栈
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 79
例,二进制数 (0-F)转换成 ASCII(‘0’-‘F’)的子程序 。
BIN2ASC PROC;要转换的数在 AL的低四位;转换结果仍在 AL中
CMP AL,9
JA A2F
ADD AL,30H
JMP DONE
A2F,ADD AL,37H
DONE,RET
BIN2ASC ENDP
调用方法,( 在主程序中 )
…
MOV AL,0CH
CALL BIN2ASC
(AL中有 0CH的 ASCII码 43H,’C’)
微机原理及应用 —— 第4章 汇编语言 80
书本:例 4-1两个 32位无符号数乘法程序。
在 8086中,数据是 16位的,它只有 16位运算指令,若是两个 32位数相乘就无法直接用指令实现,但可以用 16位乘法指令做 4次乘法,然后把部分积相加来实现。
A B
X C D
微机原理及应用 —— 第4章 汇编语言 81
A B
X C D
微机原理及应用 —— 第4章 汇编语言 82
name 32 bit multiply
data segment
mulnum dw 0000,0ffffh,0000,0ffffh,4 dup(?)
data ends
stack segment para stack′stack′
db 100 dup(?)
stack ends
code segment
assume cs:code,ds:data,
ss:stack,es:data
start proc far
begin,push ds ; DS中包含的是程序段前缀的起 始地址
mov ax,0
push ax ;设置返回至 DOS的段值和 IP值
mov ax,data
mov ds,ax
mov es,ax ;置段寄存器初值
lea bx,mulnum
微机原理及应用 —— 第4章 汇编语言 83
mulu32,mov ax,[ bx] ; B→AX
mov si,[ bx+4] ; D→SI
mov di,[ bx+6] ; C→DI
mul si ; B× D
mov [ bx+8],ax ;保存部分积 1
mov [ bx+0ah],dx
mov ax,[ bx+2] ; A→AX
mul si ; A× D
add ax,[ bx+0ah]
adc dx,0 ;部分积 2的一部分与部分积 1的相应部分相加
mov [ bx+0ah],ax
mov [ bx+0ch],dx ;保存
mov ax,[ bx] ; B→AX
mul di; B× C
add ax,[ bx+0ah] ;与部分积 3的相应部分相加
adc dx,[ bx+0ch]
微机原理及应用 —— 第4章 汇编语言 84
mov [ bx+0ah],ax
mov [ bx+0ch],dx
pushf ;保存后一次相加的进位位
mov ax,[ bx+2] ; A→AX
mul di; A× C
popf
adc ax,[ bx+0ch] ;与部分积 4的相应部分相加
adc dx,0
mov [ bx+0ch],ax
mov [ bx+0eh],dx
ret
start endp
code ends
end begin
微机原理及应用 —— 第4章 汇编语言 85
A B
X C D
[BX+8]
[BX+0AH]
[BX+0CH]
[BX+0EH]
BXD
AXD BXC
AXC
微机原理及应用 —— 第4章 汇编语言 86
例 2,字符串处理程序设计对字符串进行操作时,往往需要确定它的长度。
通常字符串结束标志以 CR或 $作标志。所以可以用扫描 CR或 $的方法计算出串长。
在计算串长时,应注意串长一般应小于 255个字节。
以下是流程图和源程序。
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 87
简化的流程图:
开始求串长串长 <256?
显示串长高位显示串长低位结束
Y 警告,太长求串长当前字符是‘$’?
搜索 CR字符同时指针增量返回
N
串长加 1
存串长
N
找到? N
Y
Y
初始化指针 /计数器微机原理及应用 —— 第4章 汇编语言 88
程序如下:
DATA SEGMENT
STRING DB ‘This is a string…’,0DH,’$’
LENGTH1 DW? ;串长度存放在这里
CR DB 0DH
MESSAGE DB ’The string is too long!’,0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
BEGIN,MOV AX,DATA
MOV ES,AX
MOV DS,AX
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 89
CALL STRLEN ;调用子程序计算串长
MOV DX,LENGTH1 ;结果在 DX寄存器中
CMP DX,100H
JB NEXT1 ;若 (DX)< 100H,转
LEA DX,MESSAGE ;若 (DX)≥ 100H,
MOV AH,9
INT 21H ;显示信息
JMP NEXT2
NEXT1,MOV DH,DL ;串长暂存在 DH中
MOV CL,4
SHR DL,CL ;取串长高 4位
CMP DL,9
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 90
JBE LP ;≤9,转
ADD DL,7 ;> 9,加 7
LP,ADD DL,30H ;高 4位 转换 为 ASCII码
MOV AH,6
INT 21H ;显示这个 ASCII码
MOV DL,DH ;取暂存串长
AND DL,0FH ;取串长低 4位
CMP DL,9
JBE LP1 ;≤ 9,转
ADD DL,7 ;> 9,加 7
LP1,ADD DL,30H ;低 4位转换为 ASCII码
MOV AH,6
INT 21H ;显示该 ASCII码
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 91
MOV DL,’H’
MOV AH,6
INT 21H ;显示 ’ H’
NEXT2,MOV AH,4CH
INT 21H ;返回 DOS
MAIN ENDP;------- 主程序结束 --------;-----计算串长的子程序 -----
STRLEN PROC
LEA DI,STRING
MOV CX,0FFFFH ;(CX)=-1
MOV AL,CR ;(AL)=0DH
MOV AH,’$’ ;(AH)=24H
CLD ;DF=0
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 92
AGAIN,INC CX ;串长加 1,初始值 (CX)=0
CMP CX,100H
JAE DONE ;串长 >255,则结束
CMP [DI],AH ;本字符是 ’ $’?
JE DONE ;是,则结束
SCASB ;本字符是 CR?
JNE AGAIN ;未找到,返回继续
DONE,MOV LENGTH1,CX ;找到,LENGTH1← 串长
RET ;返回主程序
STRLEN ENDP;----- 子程序结束 -----
CODE ENDS
END BEGIN
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 93
本例主要介绍了:
含有子程序的汇编语言程序结构
字符串的处理 —— 如何计算字符串长度
如何把二进制数转换成 ASCII显示在屏幕上
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 94
4.5 程序设计举例在微型计算机系统上常常可以显示实时时钟,这就要求能输出数码 00~ 59。 要输出多于一个字符时,要利用功能调用 9,它是向 CRT输出字符串的子程序,要求在调用前使 DX指向字符串的首地址,字符串必须以字符“$”结束,
则功能调用 9能把字符“$”之前的全部字符向 CRT输出。
为了使每次输出的数码能够换行,在每一循环中,利用系统调用 2,分别输出一个回车和换行字符,其流程如图 4-11所示。
相应的程序为:
3,在 CRT上连续显示 00~ 59
微机原理及应用 —— 第4章 汇编语言 95
微机原理及应用 —— 第4章 汇编语言 96
4.5 程序设计举例
name output_char_00_59
stack segment para stack′stack′
db 100 dup(?)
stack ends
data segment
buffer db 3 dup(?)
data ends
code segment
assume cs,code,ds:
data,ss,stack
start proc far
begin,push ds ; 返回 DOS的一种方法
mov ax,0
push ax
mov ax,data;段寄存器赋值微机原理及应用 —— 第4章 汇编语言 97
4.5 程序设计举例
mov ds,ax
mov cx,1000;设置最大的循环次数
mov bl,0
lea si,buffer
push bx
goon,mov dl,0dh
mov ah,2;输出回车符
int 21h
mov dl,0ah ;输出换行符
mov ah,2
int 21h
pop bx
mov al,bl;将要显示的数字赋给 al
微机原理及应用 —— 第4章 汇编语言 98
4.5 程序设计举例
inc al;
daa; 组合的十进制调整
cmp al,60h; AL增加到 60了吗
jc next;未达到,转去显示
mov al,0;已到 60,置为 0
next,mov bl,al
push bx;保存 bl值
mov dl,al
push cx
mov cl,4
shr al,cl
or al,30h;把 AL中十位数,转换为 ASCII码
mov [ si],al; 十位数 ASCII码后放入缓存微机原理及应用 —— 第4章 汇编语言 99
4.5 程序设计举例
inc si;缓存指针加 1
mov al,dl
and al,0fh
or al,30h;把 AL中的个位数,转换为 ASCII码
mov [ si],al; 个位数 ASCII码放入缓存
inc si ;缓存指针加 1
mov al,′$ ′
mov [ si],al
mov dx,offset buffer ;输出字符串
mov ah,9
int 21h
微机原理及应用 —— 第4章 汇编语言 100
4.5 程序设计举例
mov cx,0ffffh
again,dec cx
jne again;若不为 0,则跳转 again
pop cx; CX恢复为初值 1000
dec cx
je done;若 CX为 0,则转 done
mov si,offset buffer
jmp goon
done,ret
Start endp
code ends
end begin
微机原理及应用 —— 第4章 汇编语言 101
附:返回 DOS方法 (1)
Main PROC FAR
begin,push ds ;
mov ax,0
push ax
……
RET
微机原理及应用 —— 第4章 汇编语言 102
附:返回 DOS方法 (1)
程序的前 256字节称为程序段前缀 PSP(用户程序名、程序长度,标明用户程序特点)。我们写的程序代码紧跟在这 256字节之后,DS在程序装入后是指向这个 PSP的首址,这时 PSP
的首址是 DS:0000,之后在使用 DS前必须重新赋值。 将 DS和 0000压栈实际就是为了能返回到 PSP的首址 。程序执行完后由 RET完成将
DS和 0000弹出到 CS和 IP,这样,将执行 PSP
首址的代码,而那里是一条 INT 20H指令,
返回到 DOS
微机原理及应用 —— 第4章 汇编语言 103
附:返回 DOS方法 (2)
MOVAH,4CH
INT21H ;返回 DOS
微机原理及应用 —— 第4章 汇编语言 104
4.码制转换十、二进制数,ASCII码之间的互相转换。
① BCD数 → 2进制数算法,Dn-1*10n-1+……+D0*10 0
= (…(D n-1*10+ Dn-2)*10+…)*10+ D 0
= (…(( 0*10+Dn-1)*10+ Dn-2)*10+…)*10+ D 0
即,新的中间结果 = 中间结果 *10+本位数字
(中间结果初值为 0)
附:自学程序微机原理及应用 —— 第4章 汇编语言 105
程序 1:将 ≤65535的非压缩 BCD数转换成 2进制数。程序如下。;数据段定义
mydata SEGMENT
decnum DB 5,3,0,1,9 ;BCD数 53019
binnum DW?
mydata ENDS
微机原理及应用 —— 第4章 汇编语言 106
prog SEGMENT
ASSUME CS:prog,DS:mydata
begin,MOV AX,mydata
MOV DS,AX
MOV SI,OFFSET decnum
MOV CX,5 ;5位 BCD数
MOV BX,10
XOR AX,AX ;中间结果初始值为 0
Next,MUL BX ;中间结果 *10+本位数字
ADD AL,[SI]
ADC AH,0
INC SI ;指向下位 BCD数
LOOP next
MOV binnum,AX ;保存结果
MOV AH,4CH
INT 21H
prog ENDS
END begin
微机原理及应用 —— 第4章 汇编语言 107
例:从键盘输入两个整数,并求其和。
因键入为整数,故要进行如下转换:
ASCII→BCD→ 二进制数
ASCII→BCD 码很简单,高 4位清零即可得到非压缩的 BCD码。
BCD→ 二进制数在本例中采用用以下方法:
((((0+千位数 )*10+百位数 )*10)+十位数 )*10+个位数
② ASCII码 → 二进制数 (用于输入 )
第一次中间结果第二次中间结果第三次中间结果最终结果微机原理及应用 —— 第4章 汇编语言 108
开始两个数分别转换成二进制数键入两个数相加结束返回 DOS
如有溢出则提示开始取第一个 ASCII码是负号吗?
数字符个数- 1,指针+ 1
指针定位字符个数- 1
= 0?
取数字,与中间结果相加,再乘以 10
指向下一个数字字符加个位数是负数则求补存结果结束
N
Y
Y
N
转换子程序微机原理及应用 —— 第4章 汇编语言 109
程序如下:
DATA SEGMENT
STR1 DB 10,?,10 DUP(?) ;第 1个数的输入缓冲区
STR2 DB 10,?,10 DUP(?) ;第 2个数的输入缓冲区
NUM DW?,? ;存转换后的二进制数
SUM DW 0 ;存和
OVER DB ‘Overflow!’,13,10,’$’
DATA ENDS;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
微机原理及应用 —— 第4章 汇编语言 110
START,MOV AX,DATA
MOV DS,AX
MOV AH,0AH
LEA DX,STR1
INT 21H ;输入第一个数字串 (设为 26)
MOV AH,0AH
LEA DX,STR2
INT 21H ;输入第二个数字串 (设为 33)
LEA BX,STR1 ;串 1的首地址送 BX
LEA DI,NUM ;存二进制首地址送 DI
CALL CHANGE ;将串 1 ASCII码 → 二进制
LEA BX,STR2 ;串 2的首地址送 BX
微机原理及应用 —— 第4章 汇编语言 111
LEA DI,NUM+2 ;指向
CALL CHANGE ;将串 2 ASCII码 → 二进制
MOV AX,NUM ;(AX)=[NUM]=001AH
ADD AX,NUM+2 ;两数相加,(AX)=003BH
MOV SUM,AX ;存和
JNO NEXT ;无溢出,转 NEXT
LEA DX,OVER
MOV AH,9
INT 21H ;显示 ’ Overflow!’
NEXT,MOV AH,4CH
INT 21H ;返回 DOS
MAIN ENDP
微机原理及应用 —— 第4章 汇编语言 112
CHANGE PROC
MOV CL,[BX+1] ;实际字符数送 CL
MOV AL,[BX+2] ;第一个字符送 AL
MOV CH,AL ;暂存在 CH
CMP AL,’-’ ;第一个字符是负号吗?
JNZ NEXT1 ;不是,转 NEXT1
DEC CL ;字符数减 1
INC BX
NEXT1,ADD BX,2 ;指向第一个数字字符
MOV AX,0 ;清零 AX,存二进制数
LP1,DEC CL
JZ NEXT2 ;若 (CL)=0,转 NEXT2
MOV DL,[BX] ;取字符
AND DL,0FH ;转换成 BCD码
ADD AL,DL ;加到中间结果上
ADC AH,0
微机原理及应用 —— 第4章 汇编语言 113
MOV DX,10
MUL DX ;*10
INC BX ;指向下一个字符
JMP SHORT LP1
NEXT2,MOV DL,[BX] ;取个位数
AND DL,0FH ;个位 ASCII→ 未组合 BCD
ADD AX,DX ;加个位数,(AX)=001AH
CMP CH,’-’ ;是 ’ -’?
JNZ NEXT3 ;该数非负,转 NEXT3
NEG AX ;若为负,求补
NEXT3,MOV [DI],AX ;存二进制结果
RET
CHANGE ENDP;
CODE ENDS
END START
微机原理及应用 —— 第4章 汇编语言 114
02
0A
32
36
0D
…
02
0A
33
33
0D
…
00
1A
21
00
3B
00
STR1
STR2
NUM
SUM
10个
10个
‘ O’
…
…
OVER
04
0A
31
32
34
…
STR1
若键入 ‘ 1234’
33
0D
‘ 1’
‘ 2’
‘ 3’
‘ 4’
…
设键入第 1个数为 26,第 2个数为 33,则在内存各变量分配如下,
微机原理及应用 —— 第4章 汇编语言 115
本例题重点掌握,
*如何从键盘输入一个字符串
* ASCII→ 未组合 BCD→ 二进制
*有符号数的运算,对负数和溢出如何处理思考题,
若键入第一个数 26,第二个数为 -4,填写各变量结果 。
微机原理及应用第 4章 汇编程序微机原理及应用 —— 第4章 汇编语言 2
第 4章 指令系统主要内容学习目的知识点重点难点微机原理及应用 —— 第4章 汇编语言 3
汇编语言格式;
主要内容汇编语言语句;2
1
3 汇编程序;
微机原理及应用 —— 第4章 汇编语言 4
1.掌握汇编语言的格式 ;
2.熟练汇编语言编程;
学习目的微机原理及应用 —— 第4章 汇编语言 5
4,1 汇编语言源程序格式语法
机器语言,机器能识别并执行,称目标程序,是二进制码。
汇编语言 ( Assemble Language),用指令助记符、
符号地址、标号等书写的语言。
汇编语言源程序,用汇编语言编写的程序。
汇编,汇编语言源程序?目标程序微机原理及应用 —— 第4章 汇编语言 6
4.1 汇编语言源程序机器语言 —— 二进制数形式的指令和数据。
B0 64 是什么意思?这就是机器语言。既不直观,
又不易理解和记忆,
MOV AL,64H ; 很容易记忆理解,这就是 助记符 。
助记符 —— 用便于记忆的英语单词表示的指令操作码。
它反映了指令的功能和主要特征,便于人们理解和记忆。
微机原理及应用 —— 第4章 汇编语言 7
4,1 汇编语言源程序格式语法操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,
改动也很麻烦。于是人们 采用标号或符号来代替地址,例:
LP1,mov ax,VAR
…
loop LP1
汇编语言 —— 指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则 。
用汇编语言编写的程序叫 汇编语言源程序 。
指令除了操作码以外,还有一个操作数问题。
微机原理及应用 —— 第4章 汇编语言 8
4,1 汇编语言源程序格式语法汇编语言程序设计与执行过程
输入汇编语言源程序 源文件,ASM
汇编(编译) 目标文件,OBJ
链接 可执行文件,EXE
调试 最终程序微机原理及应用 —— 第4章 汇编语言 9
4.1.1 汇编语言源程序的结构汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:
数据段 —— 存放数据、变量堆栈段 —— 堆栈区域代码段 —— 存放程序指令微机原理及应用 —— 第4章 汇编语言 10
4,1 汇编语言源程序格式语法
一个基本的汇编语言程序框架如下:
stack SEGMENT PARA ‘stack‘
DB 100 DUP(‘stack’)
stack ENDS
data SEGMENT
<数据、变量在此定义 >
data ENDS
code SEGMENT
ASSUME CS:code,DS:data,ES:data
start,MOV AX,data
MOV DS,AX
MOV ES,AX
<此处加入你自己的程序段 >
MOV AL,4CH
INT 21H
code ENDS
END start
微机原理及应用 —— 第4章 汇编语言 11
4.1.2 汇编语言的语句与格式
汇编语言的语句有两种:
指令性语句 —— 由 8086指令助记符构成的语句指示性语句 —— 由伪指令构成的语句
指令性语句 的格式为:
标号,指令助记符 目的操作数,源操作数 ;注释
指示性语句 的格式为:
名字 伪指令 操作数 1,操作数 2,…,操作数 n ;注释注,各部分之间至少要用一个空格作为分隔符。
微机原理及应用 —— 第4章 汇编语言 12
4.1.2 汇编语言的语句与格式
● 指令性语句 由 CPU执行,每一条指令性语句都有一条机器码指令与其对应 ;
● 指示性语句 由 汇编程序 执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。
指令性语句汇编时 生成 机器码;
指示性语句汇编时 不生成 机器码。
微机原理及应用 —— 第4章 汇编语言 13
4.1.2 汇编语言的语句与格式语句的构成元素:
标号 —— 指令的符号地址,用来代表指令在存储器中的地址。
只能出现在指令性语句中,标号后应加上冒号。
名字 —— 段、过程、变量的名字,用来代表它们在存储器中的地址。 只能出现在指示性语句中,名字后不加冒号 。
指令助记符 —— 8086助记符、伪指令
操作数 —— 即指令的操作对象
对指令性语句 —— 0,1,2个
对指示性语句 —— 根据需要而定
操作数之间以逗号分隔
操作数可以是,寄存器、存储单元、常数或表达式例如,AX,[DI+BX+10],200,16*8+TABLE,等等微机原理及应用 —— 第4章 汇编语言 14
4.1.2 汇编语言的语句与格式
注释 —— 以分号开头,可放在指令后,也可单独一行。
注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。
例如:以下为同一条指令写的注释
1) MOV CX,100 ;传送 100到 CX
2) MOV CX,100 ;循环计数器置初值显然,第二种写法要比第一种写法要好。
微机原理及应用 —— 第4章 汇编语言 15
汇编语言的一个实例,hello.asm
data SEGMENT
Hello DB ‘Hello,world!’,0DH,0AH,’$’
data ENDS
prog SEGMENT
ASSUME CS:prog,DS:data
start,MOV AX,data
MOV DS,AX
LEA DX,hello ;取字符串首地址
MOV AH,9
INT 21H ;显示字符串
MOV AH,4CH
INT 21H ;退回 DOS
prog ENDS
END start
名字标号微机原理及应用 —— 第4章 汇编语言 16
4.1.3 数据项与表达式数据项包括 常量,变量,标号 及 表达式 。
1.常量
二进制数,以 B结尾。如 01001101B。
十进制数,如 85。
十六进制数,以 H结尾 。 第 1个数字为 A-F时,前面应加 0,如 0F160H。
字符串:用引号括起来的 1个或多个字符 。 如
‘ ERROR!’,’a’,汇编时被翻译成对应的 ASCII
码 45H,52H,52H,4FH,52H,21H和 61H。
微机原理及应用 —— 第4章 汇编语言 17
4.1.3 数据项与表达式
有三个属性:
段地址,即标号所在段的段地址;
偏移量,标号所代表存储单元的段内偏移地址;
类 型,NEAR或 FAR:
NEAR— 表示标号所在语句与转移指令 /
调用指令在同一码段内,跳转时只需改变 IP即可。
FAR— 标号所在语句与转移指令 /调用指令不在同一代码段内。
若没有对类型进行说明,默认为 NEAR。
标号通常作为 转移指令 或 CALL指令 的转移地址。
2.标号 —— 指令所在内存单元的符号地址微机原理及应用 —— 第4章 汇编语言 18
4.1.3 数据项与表达式变量 —— 即内存中的存储单元或数据区。
变量名 —— 是存储单元 (数据区 )的符号地址或名字。
变量也有三个属性,
段地址 — 变量所在段的段地址
偏移量 — 变量单元地址与段首地址之间的位移量。
类 型 — 有 BYTE,WORD和 DWORD三种 。
变量在程序中作为 存储器操作数 被引用。
3.变量微机原理及应用 —— 第4章 汇编语言 19
4.1.3 数据项与表达式
标号和变量名的使用规则
组成,A-Z(不分大小写 ),0-9,? @,_ $
不能以数字开头,句号 (.)只能作为首字符
长度小于 31个字符
不能与保留字 (指令助记符、伪指令、预定义符号等 )重名
不能重复定义例如:
正确的,LP1,AGAIN,NEXT,_GO,OK_1
错误的,4M,LOOP,AAA,#HELP,+ONE
微机原理及应用 —— 第4章 汇编语言 20
4.1.3 数据项与表达式
4.表达式
表达式是常数、寄存器、标号、变量与运算符的组合。
有数字表达式和地址表达式两种。
汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。
表达式中的运算符有 6类:算术、逻辑、关系、取地址、属性、杂类。
微机原理及应用 —— 第4章 汇编语言 21
4.1.3 数据项与表达式
用于数字表达式,例:
MOV AX,4*1024
汇编后的形式为,
MOV AX,4096
用于地址表达式,例,
LEA SI,TAB+3
若 TAB的偏移地址为 1000H,则汇编后的形式为:
LEA SI,[1003H]
1)算术运算符 —— +,-,*,/,MOD
微机原理及应用 —— 第4章 汇编语言 22
4.1.3 数据项与表达式逻辑运算符只能用于数字表达式中。
例,MOV CL,36H AND 0FH
经汇编后,MOV CL,06H
注意,不要把逻辑运算符与逻辑运算指令混淆:
例,AND AX,3FC0H AND 0FF00H
汇编后源操作数被翻译为,3F00H,所以上述指令与
AND AX,3F00H等价。
2)逻辑运算符 —— AND,OR,XOR,NOT
微机原理及应用 —— 第4章 汇编语言 23
4.1.3 数据项与表达式
关系运算的结果是一个逻辑值,真 或 假关系为真,结果为全 1
关系为假,结果为全 0
例,MOV BX,PORT GT 300H
若 PORT的值大于 300H,则汇编后为:
MOV BX,0FFFFH
否则汇编后为:
MOV BX,0
3)关系运算符 —— EQ,NE,LT,GT,LE,GE
微机原理及应用 —— 第4章 汇编语言 24
4.1.3 数据项与表达式
SEG:取变量 /标号的段地址
OFFSET:取变量 /标号的偏移地址例,VAR DB 12H
……
MOV BX,OFFSET VAR ;取变量 VAR的偏移地址
MOV AX,SEG VAR ;取变量 VAR的段地址注意,以下指令的异同:
MOV BX,OFFSET VAR
LEA BX,VAR
OFFSET只能取静态的偏移地址;
LEA指令即可取静态的偏移地址,也可取动态的偏移地址。
4)取地址运算符 —— SEG,OFFSET
微机原理及应用 —— 第4章 汇编语言 25
4.1.3 数据项与表达式
TYPE 取变量的类型( 1,2,4)
LENGTH 取所定义变量的长度
(即变量中元素的个数)
SIZE 取所定义存储区的字节数
( =TYPE*LENGTH)
例,VAR DW 1,2,3,4,5
则 TYPE VAR = 2
LENGTH VAR = 5
SIZE VAR = 10
5)取值运算符 —— TYPE,LENGTH,SIZE
微机原理及应用 —— 第4章 汇编语言 26
4.1.3 数据项与表达式
6)属性运算符 —— PTR
用来指定地址操作数的类型。
格式,<类型 > PTR <地址操作数 >
类型 ∈ {BYTE,WORD,DWORD,NEAR,FAR}
BYTE,WORD,DWORD
用于描述数据存储单元 (变量 )地址
NEAR,FAR
用于描述转移、调用的目的地址微机原理及应用 —— 第4章 汇编语言 27
4.1.3 数据项与表达式例,MOV BYTE PTR[DI],0 ;字节类型
MOV WORD PTR[DI],0 ;字类型
MOV [DI],0B5H ;类型不定
PTR也可用来进行强制类型转换例,STR1 DW? ;STR1定义为字类型
MOV AX,STR1 ;合法
MOV AL,STR1 ;非法
MOV AL,BYTE PTR STR1 ;合法微机原理及应用 —— 第4章 汇编语言 28
4.2 指示性语句-伪指令
数据定义伪指令
符号定义伪指令
段定义和段寄存器指定伪指令
过程定义伪指令
结束伪指令由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:
微机原理及应用 —— 第4章 汇编语言 29
用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:
变量名 数据定义伪指令 操作数,操作数,…
常用的数据定义伪指令有如下几种:
DB 定义 字节
DW 定义 字
DD 定义 双字
操作数可以是常数、变量或表达式
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 30
例 1:
DATA_B DB 10,5,10H
DATA_W DW 100H,-4
DATA_D DD 0FFFBH
汇编后的内存分配情况如右图所示。
05H
10H
00H
01H
FCH
FFH
FBH
FFH
00H
00H
0AHDATA_B
DATA_W
DATA_D
10
5
10H
100H
-4
0FFFBH
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 31
例 2:操作数可以是字符串,例如
STR DB ‘HELLO’
汇编后的情况如图,STR ‘
H’‘
E’‘ L’
‘ L’
‘
O’
48H
45H
4CH
4CH
4FH
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 32
操作数?用来保留存储空间,但不存入数据,
例 3,ABC DB 0,1,2,3,4,’OK’,’$’
RSV DW?,?,?,?,?,?,?,?
复制操作符 DUP:
重复的数据可以使用复制操作符 DUP,如上面
RSV亦可写成,
RSV DW 8 DUP(?)
若操作数中若使用 $,则表示的是地址计数器的当前值。
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 33
例,TABLE DB 10 DUP(?)
BUFFER DW TABLE,$+3
设 TABLE的偏移地址为 0080H,则汇编后如下图所示:
BUFFER
0080H
80H
TABLE
008AH
008BH
008CH
008DH
...
8FH
00H
00H
0089H
10 Bytes
4.2.1 数据定义伪指令微机原理及应用 —— 第4章 汇编语言 34
把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于 C语言中的 #define。
符号定义伪指令 有两种,EQU,=
用 EQU定义的符号未清除前,不能重新定义。
清除 EQU定义可用 PURGE伪指令。
用,=”定义的符号可在任何时候进行重定义。
二者 均不占用存储空间,仅是给符号赋值
4.2.2 符号定义伪指令微机原理及应用 —— 第4章 汇编语言 35
例,FIVE EQU 5
COUNT EQU CX
TEN EQU 10
DIST = BYTE PTR[SI+BP]
GOTO = JMP
…
MOV AX,TEN
MOV CX,COUNT
ADD DIST,FIVE
DIST = WORD PTR[SI+BP+1]
ADD DIST,AX
GOTO LABEL
定义引用
4.2.2 符号定义伪指令微机原理及应用 —— 第4章 汇编语言 36
汇编语言程序是按段来组织程序和数据的。
和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。
三类段:代码 (程序 )、数据、堆栈
段定义伪指令,SEGMENT,ENDS,ASSUME,ORG
定义一个段的基本格式:
段名 SEGMENT [定位类型 ][组合方式 ][类别 ]
<汇编语言语句 >
段名 ENDS
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 37
这两个伪指令总是成对出现,二者前面的段名应一致。 SEGMENT说明了一个段的开始,
ENDS说明了一个段的结束。
对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。
如,data SEGMENT
<指令语句 >
data ENDS
SEGMENT和 ENDS伪指令
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 38
ASSUME伪指令
在代码段中,还必须明确段和段寄存器的关系,
这由 ASSUME语句来指定。如
ASSUME CS:code,DS:data,ES:data
语句中的 code和 data为段名。
这个语句说明:
1,CS将指向名字为 code的代码段
2,DS和 ES将指向名字为 data的数据段
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 39
但要注意,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句
MOV AX,DATA
MOV DS,AX
MOV ES,AX
将段基址装入段寄存器 。如果程序中用到堆栈段,则 SS也需装入实际的初值。
代码段基地址 不需要程序员装入 CS寄存器,
而由 OS负责装入 。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 40
SEGMENT语句后可以带有可选参数,用以 规定逻辑段的其他一些 属性 。
1) 定位类型说明 如何确定逻辑段的边界。有四种:
PARA(Paragraph),逻辑段从一个节 (16个字节 ) 的边界开始。 即 段的起始地址应能被 16整除,或这说段 起始物理地址应为 ×××× 0H。 —— 默认类型
BYTE,逻辑段从字节边界开始,即段可以从任何地址开始。
WORD,逻辑段从字边界开始。即段的起始地址必须是偶数。
PAGE,逻辑段从页边界开始。 256字节称为一页,故段的起始物理地址应为××× 00H。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 41
2) 组合类型说明不同模块中同名段的组合方式。
PUBLIC,所有此类型的 同名段 组合成一个逻辑段,
公用一个段地址,运行时装入同一个物理段中。
COMMON,所有此类型的同名段具有相同的起始地址 (但是会覆盖 ),共享相同的存储区域。
AT <数值表达式 >,按绝对地址定位,段地址就是表达式的值。
STACK,专用于说明堆栈段,组合方式同 PUBLIC
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 42
3) 类别用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。
如:在模块 1中有段定义:
seg1 SEGMENT PARA STACK ‘stack’
…
seg1 ENDS
在模块 2中有段定义:
seg2 SEGMENT PARA STACK ‘stack’
…
seg2 ENDS
则连接时这两个段被安排在一起。
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 43
ORG规定了段内的指令或数据存放的开始地址 (偏移地址的初值 ),其格式为:
ORG <表达式 >
表达式的值即为开始地址,从此地址起连续存放程序或数据 。
例,ABC SEGMENT
ORG 100H
begin,…
…
ABC ENDS
ORG伪指令指令从 100H
开始存放
4.2.3 段定义伪指令微机原理及应用 —— 第4章 汇编语言 44
过程就是子程序。一个过程可以被其它程序所调用
(用 CALL指令 ),过程的最后一条指令一般是返回指令
(RET)。
过程定义伪指令的格式为
<过程名 > PROC [类型 ]
…
…
RET
<过程名 > ENDP
注意,PROC和 ENDP必须成对出现 。
4.2.4 过程定义伪指令微机原理及应用 —— 第4章 汇编语言 45
过程的类型有两种:
NEAR—— (默认类型 )表示段内调用
FAR—— 表示段间调用调用一个过程的格式为:
CALL <过程名 >
4.2.4 过程定义伪指令微机原理及应用 —— 第4章 汇编语言 46
如果需要多次使用同一个程序段,可以将这个程序段定义为一个,宏 指令”,
然后 在 需要时,可简单地用 宏指令名 来代替这个程序段。
指令的格式为:
<宏指令名 > MACRO [形参表 ]
<宏定义体 >
ENDM
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 47
例,两个数之和的宏定义和宏调用 。
宏定义为:
DADD MACRO X,Y,Z
MOV AX,X
ADD AX,Y
MOV Z,AX
ENDM
X,Y,Z是形式参数。调用宏 DADD时可写为:
DADD DATA1,DATA2,SUM
DATA1,DATA2,SUM是实际参数,由 它们替换定义中的 X,Y,Z。
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 48
宏调用与过程 (子程序 )调用 都是一次定义,多次调用 。 它们之间的差别是:
① 执行形式,宏命令伪指令由宏汇编程序 在汇编过理中进行处理,而 CALL,RET则是 由 CPU执行的指令 。
② 汇编结果,宏命令伪指令 汇编后被展开。
③ 执行速度,宏命令 执行速度较快 (因无调用转移 )
④ 占用内存,宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。 使用过程可以节省代码占用的内存空间。
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 49
宏展开:汇编程序会把宏调用按宏定义展开。
例如:宏定义为:
Display MACRO string
LEA DX,string
MOV AH,9
INT 21H
ENDM
程序中宏调用:
……
DISPLAY ERROR_MESSAGE
DISPLAY EXIT_MESSAGE
……
汇编后的结果,(带有 +号的指令为宏展开后的结果 )
……
+ LEA DX,ERROR_MESSAGE
+ MOV AH,9
+ INT 21H
+ LEA DX,EXIT_MESSAGE
+ MOV AH,9
+ INT 21H
……
4.2.5 宏定义伪指令微机原理及应用 —— 第4章 汇编语言 50
汇编语言源程序的最后,要加 汇编结束伪指令 END,以使汇编程序结束汇编。
格式,END [表达式 ]
END后跟的表达式通常就是 程序第一条指令的标号,指示程序的启动地址 (要执行的第一条指令的地址 )。
4.2.6 汇编结束伪指令 END
微机原理及应用 —— 第4章 汇编语言 51
系统功能调用 —— 由 OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。
系统功能调用有两种,一种称为 DOS功能调用,另一种称为 BIOS功能调用。
用户程序在调用这些系统服务程序时,不是用 CALL
命令,而是采用软中断指令 INT n来实现。
在 DOS系统 中,常用功能调用一般都是用软中断指令
INT 21H来实现的。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 52
INT 2lH功能大致可以分为四个方面:
设备管理、目录管理、文件管理和其它。
D0S系统功能调用的使用方法如下:
① AH← 功能号 ;
② 设置该功能所要求的其他入口参数;
③ 执行 INT 21H指令;
④ 分析出口参数 。
以下 介绍 INT 21H的几个最常用的功能 。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 53
关于数据输入和输出我们这里只讨论键盘输入 和 显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。
1,DOS键盘功能调用
(1) 从键盘输入一个字符 (功能号 =1)
MOV AH,1
INT 21H
<AL中有键入的字符 >
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 54
例,程序中有时需要用户对提示做出应答。
GET_KEY,MOV AH,1 ;等待键入字符
INT 21H ;结果在 AL中
CMP AL,’Y’ ;是 ’ Y’?
JZ YES ;是,转 YES
CMP AL,’N’ ;是 ’ N’?
JZ NO ;是,转 NO
JMP GET_KEY ;否则继续等待输入
YES,…
…
NO,…
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 55
(2) 输入字符串 (功能号 =0AH)
此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。
MOV AH,0AH
LEA DX,<字符串缓冲区首地址 >
INT 21H
(预留的 N1个字节的存储单元 ) 0DHN2N1
N1,缓冲区长度 (最大键入字符数 )
N2,实际键入的字符数 (不包括回车符 )
用户定义的输入字符串的缓冲区格式
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 56
若用户键入的字符数 (包括回车 )≥ 定义的 N1,
本功能调用将不再接收新的键入,且光标不再向右移动。
例:设在数据段定义键盘缓冲区如下:
STR1 DB 10,?,10 DUP(?)
调用 DOS功能的 0AH号功能的程序段为:
LEA DX,STR1
MOV AH,0AH
INT 21H
此程序段最多从键盘接收 10个按键(包括回车)。
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 57
2,DOS显示功能调用
(1) 在显示器上显示一个字符 (功能号 =2)
MOV AH,2
MOV DL,<要显示的字符 >
INT 21H
例:在显示器上显示一个字符 ‘ A’
MOV AH,2
MOV DL,’A’ ;或 MOV DL,41H
INT 21H
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 58
MOV AH,9
LEA DX,<字符串 >
INT 21H
注意:被显示的字符串必须以 ’ $’ 结束 。
(2)显示字符串 (功能号 =9)
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 59
例,在屏幕上显示,’ HELLO,WORLD!’
在数据段定义字符串:
DATA SEGMENT
STR1 DB ‘HELLO,WORLD!$’
DATA ENDS
在代码段中进行显示输出
MOV AH,9
LEA DX,STR1
INT 21H
4.3 DOS系统功能调用介绍微机原理及应用 —— 第4章 汇编语言 60
附,BIOS功能调用
BIOS:基本输入输出系统,是固化在 EPROM中的一组实现基本输入输出功能的子程序。
BIOS调用通过多个软中断提供,调用方法为,
MOV AH,<功能号 >
<设置入口参数,一般将参数放在寄存器中 >
INT <中断类型 >
BIOS中的几个主要中断类型如下:
INT 10H—— 屏幕显示
INT 13H—— 磁盘操作
INT 14H—— 串行口操作
INT 16H—— 键盘操作
INT 17H—— 打印机操作每类中断由包含许多子功能,调用时通过功能号指定。
微机原理及应用 —— 第4章 汇编语言 61
4.3.1宏伪指令补充
(1) LOCAL
宏定义体内允许使用标号。例如,在 AL中有 1位十六进制数码要转换为 ASCII码,则可以用以下宏定义:
CHANGE MACRO
CMP AL,10
JL ADD_0
ADD AL,′A′-′0′-10
ADD_0,ADD AL,′0′
ENDM
微机原理及应用 —— 第4章 汇编语言 62
若在一个程序中多次使用这条宏指令,则在汇编展开时,标号 ADD_0就会出现重复定义的错误,这是不允许的。
CHANGE MACRO
LOCAL ADD_0
CMP AL,10
JL ADD_0
ADD AL,′A′-′0′-10
ADD_0 ADD AL,′0′
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 63
REPT
这个伪指令可以重复执行在它的指令体部分所包含的语句。重复执行的次数,由表达式的值所决定。
REPT 〈 表达式 〉
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 64
例,把 1~ 10分配给十个连续的存储单元。
Address MACRO
X = 0
REPT 10
X = X+1
DB X
ENDM
利用这个伪指令可以对某个存储区赋值 (建立一个表 )。
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 65
IRP
此伪指令能重复执行指令体部分所包含的语句,
重复的次数由参数表中参数的个数所决定参数表中的参数必须用两个尖括号括起来,参数间用逗号分隔 )
每重复一次按次序用参数表中的参数代替形式参量
IRP 形式参量 (参数表 )
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 66
例:把 1到 10分配给 10个连续的存储单元。
Address_1 MACRO
IRP X〈 1,2,3,4,5,6,7,8,9,10〉
DB X
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 67
IRPC
此伪指令能重复执行指令体部分所包含的语句,
重复的次数由参数表 字符串 中 字符 的个数所决定
参数表中的参数也用两个尖括号括起来
每重复一次按次序用参数表中的 字符 代替形式参量
IRPC 形式参量 (参数表 )
}指令体
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 68
例:把 1到 10分配给 10个连续的存储单元。
Address_1 MACRO
IRPC X,0123456789
DB X+1
ENDM
4.3.1宏伪指令补充微机原理及应用 —— 第4章 汇编语言 69
汇编语言程序设计的步骤:
1-根据实际问题抽象出数学模型,确定算法
2-画出程序框图 (流程图 )
3-分配内存工作单元和寄存器
4-根据框图编写源程序,存成,ASM文件
5-对源程序汇编,生成,OBJ目标文件
6-把,OBJ文件连接成,EXE执行文件
7-运行,调试源程序的基本结构,顺序,分支,循环,过程
4.4 汇编语言程序设计基础微机原理及应用 —— 第4章 汇编语言 70
(1)用方框表示工作框,框中用简明语言标明要完成的功能
(2) 用菱形框表示判断框框中标明比较、判断和条件如何绘制程序框图 (流程图 )?
N
Y
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 71
(4)各框之间用直线连起来表示程序走向。
框中标明 子程序名字 (入口参数等 )
(3)用 框表示调用子程序或过程 。
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 72
汇编语言上机过程
Y
Y
Y
N
N
N
有错?
有错?
有错?
结束汇 编输入 (修改 )源程序连 接运 行查 错开始用 EDIT,NOTEPAD等任何文本编辑器。源程序存为,ASM文件用 MASM宏汇编程序进行汇编。
汇编后生成,OBJ目标文件。
命令格式,MASM <源文件名,ASM>;
用 LINK连接程序进行连接。
连接后生成,EXE可执行文件。
命令格式,LINK <目标文件名,OBJ>;
用 TD,DEBUG等调试程序进行调试。
命令格式,TD <可执行文件名,EXE>
4.4.1 概述微机原理及应用 —— 第4章 汇编语言 73
标号,
条件满足
?
处理
N
Y
IF…THEN 结构程序结构:
…
测试 /比较指令 (TEST/CMP)
条件转移指令 (Jx 标号 )
处理体标号,其他指令
…
4.4.2 分支程序微机原理及应用 —— 第4章 汇编语言 74
程序结构:
TEST/CMP指令
Jx 标号 1
处理体 P1
JMP 标号 2
标号 1:
处理体 P2
标号 2:其他指令
…
条件满足
?
处理 P1 处理 P2
标号 1:
标号 2:
条件 1 条件 2
IF…THEN…ELSE 结构
4.4.2 分支程序微机原理及应用 —— 第4章 汇编语言 75
4.4.3 循环程序
1,DO…UNTIL< 条件 > 结构先执行,再判断条件。工作部分至少执行一次。
初始化循环体循环控制继续循环? Y
N
微机原理及应用 —— 第4章 汇编语言 76
2,DO WHILE<条件 > 结构先判断条件,再执行。工作部分有可能一次都不执行。
初始化循环体循环控制继续循环? Y
N
4.4.3 循环程序微机原理及应用 —— 第4章 汇编语言 77
注意:循环可以嵌套 (多重循环 ),但多个循环体之间不能交叉,控制条件不能混淆。
内外两层循环;
外循环用于控制有多少轮内循环。
4.4.3 循环程序微机原理及应用 —— 第4章 汇编语言 78
掌握以下几点,
调用子程序用 CALL指令,返回调用程序用 RET指令 。
子程序允许嵌套调用 。
进入子程序后首先要保护主程序的运行状态 (标志位 )和使用的寄存器内容 (称为 保护现场 ),退出子程序前要 恢复现场 。
调用前要预先确定子程序中要 使用哪些寄存器,
并 定义入口参数和出口参数 。 参数传递可利用寄存器,存储单元或堆栈
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 79
例,二进制数 (0-F)转换成 ASCII(‘0’-‘F’)的子程序 。
BIN2ASC PROC;要转换的数在 AL的低四位;转换结果仍在 AL中
CMP AL,9
JA A2F
ADD AL,30H
JMP DONE
A2F,ADD AL,37H
DONE,RET
BIN2ASC ENDP
调用方法,( 在主程序中 )
…
MOV AL,0CH
CALL BIN2ASC
(AL中有 0CH的 ASCII码 43H,’C’)
微机原理及应用 —— 第4章 汇编语言 80
书本:例 4-1两个 32位无符号数乘法程序。
在 8086中,数据是 16位的,它只有 16位运算指令,若是两个 32位数相乘就无法直接用指令实现,但可以用 16位乘法指令做 4次乘法,然后把部分积相加来实现。
A B
X C D
微机原理及应用 —— 第4章 汇编语言 81
A B
X C D
微机原理及应用 —— 第4章 汇编语言 82
name 32 bit multiply
data segment
mulnum dw 0000,0ffffh,0000,0ffffh,4 dup(?)
data ends
stack segment para stack′stack′
db 100 dup(?)
stack ends
code segment
assume cs:code,ds:data,
ss:stack,es:data
start proc far
begin,push ds ; DS中包含的是程序段前缀的起 始地址
mov ax,0
push ax ;设置返回至 DOS的段值和 IP值
mov ax,data
mov ds,ax
mov es,ax ;置段寄存器初值
lea bx,mulnum
微机原理及应用 —— 第4章 汇编语言 83
mulu32,mov ax,[ bx] ; B→AX
mov si,[ bx+4] ; D→SI
mov di,[ bx+6] ; C→DI
mul si ; B× D
mov [ bx+8],ax ;保存部分积 1
mov [ bx+0ah],dx
mov ax,[ bx+2] ; A→AX
mul si ; A× D
add ax,[ bx+0ah]
adc dx,0 ;部分积 2的一部分与部分积 1的相应部分相加
mov [ bx+0ah],ax
mov [ bx+0ch],dx ;保存
mov ax,[ bx] ; B→AX
mul di; B× C
add ax,[ bx+0ah] ;与部分积 3的相应部分相加
adc dx,[ bx+0ch]
微机原理及应用 —— 第4章 汇编语言 84
mov [ bx+0ah],ax
mov [ bx+0ch],dx
pushf ;保存后一次相加的进位位
mov ax,[ bx+2] ; A→AX
mul di; A× C
popf
adc ax,[ bx+0ch] ;与部分积 4的相应部分相加
adc dx,0
mov [ bx+0ch],ax
mov [ bx+0eh],dx
ret
start endp
code ends
end begin
微机原理及应用 —— 第4章 汇编语言 85
A B
X C D
[BX+8]
[BX+0AH]
[BX+0CH]
[BX+0EH]
BXD
AXD BXC
AXC
微机原理及应用 —— 第4章 汇编语言 86
例 2,字符串处理程序设计对字符串进行操作时,往往需要确定它的长度。
通常字符串结束标志以 CR或 $作标志。所以可以用扫描 CR或 $的方法计算出串长。
在计算串长时,应注意串长一般应小于 255个字节。
以下是流程图和源程序。
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 87
简化的流程图:
开始求串长串长 <256?
显示串长高位显示串长低位结束
Y 警告,太长求串长当前字符是‘$’?
搜索 CR字符同时指针增量返回
N
串长加 1
存串长
N
找到? N
Y
Y
初始化指针 /计数器微机原理及应用 —— 第4章 汇编语言 88
程序如下:
DATA SEGMENT
STRING DB ‘This is a string…’,0DH,’$’
LENGTH1 DW? ;串长度存放在这里
CR DB 0DH
MESSAGE DB ’The string is too long!’,0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
BEGIN,MOV AX,DATA
MOV ES,AX
MOV DS,AX
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 89
CALL STRLEN ;调用子程序计算串长
MOV DX,LENGTH1 ;结果在 DX寄存器中
CMP DX,100H
JB NEXT1 ;若 (DX)< 100H,转
LEA DX,MESSAGE ;若 (DX)≥ 100H,
MOV AH,9
INT 21H ;显示信息
JMP NEXT2
NEXT1,MOV DH,DL ;串长暂存在 DH中
MOV CL,4
SHR DL,CL ;取串长高 4位
CMP DL,9
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 90
JBE LP ;≤9,转
ADD DL,7 ;> 9,加 7
LP,ADD DL,30H ;高 4位 转换 为 ASCII码
MOV AH,6
INT 21H ;显示这个 ASCII码
MOV DL,DH ;取暂存串长
AND DL,0FH ;取串长低 4位
CMP DL,9
JBE LP1 ;≤ 9,转
ADD DL,7 ;> 9,加 7
LP1,ADD DL,30H ;低 4位转换为 ASCII码
MOV AH,6
INT 21H ;显示该 ASCII码
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 91
MOV DL,’H’
MOV AH,6
INT 21H ;显示 ’ H’
NEXT2,MOV AH,4CH
INT 21H ;返回 DOS
MAIN ENDP;------- 主程序结束 --------;-----计算串长的子程序 -----
STRLEN PROC
LEA DI,STRING
MOV CX,0FFFFH ;(CX)=-1
MOV AL,CR ;(AL)=0DH
MOV AH,’$’ ;(AH)=24H
CLD ;DF=0
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 92
AGAIN,INC CX ;串长加 1,初始值 (CX)=0
CMP CX,100H
JAE DONE ;串长 >255,则结束
CMP [DI],AH ;本字符是 ’ $’?
JE DONE ;是,则结束
SCASB ;本字符是 CR?
JNE AGAIN ;未找到,返回继续
DONE,MOV LENGTH1,CX ;找到,LENGTH1← 串长
RET ;返回主程序
STRLEN ENDP;----- 子程序结束 -----
CODE ENDS
END BEGIN
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 93
本例主要介绍了:
含有子程序的汇编语言程序结构
字符串的处理 —— 如何计算字符串长度
如何把二进制数转换成 ASCII显示在屏幕上
4.5 程序设计举例微机原理及应用 —— 第4章 汇编语言 94
4.5 程序设计举例在微型计算机系统上常常可以显示实时时钟,这就要求能输出数码 00~ 59。 要输出多于一个字符时,要利用功能调用 9,它是向 CRT输出字符串的子程序,要求在调用前使 DX指向字符串的首地址,字符串必须以字符“$”结束,
则功能调用 9能把字符“$”之前的全部字符向 CRT输出。
为了使每次输出的数码能够换行,在每一循环中,利用系统调用 2,分别输出一个回车和换行字符,其流程如图 4-11所示。
相应的程序为:
3,在 CRT上连续显示 00~ 59
微机原理及应用 —— 第4章 汇编语言 95
微机原理及应用 —— 第4章 汇编语言 96
4.5 程序设计举例
name output_char_00_59
stack segment para stack′stack′
db 100 dup(?)
stack ends
data segment
buffer db 3 dup(?)
data ends
code segment
assume cs,code,ds:
data,ss,stack
start proc far
begin,push ds ; 返回 DOS的一种方法
mov ax,0
push ax
mov ax,data;段寄存器赋值微机原理及应用 —— 第4章 汇编语言 97
4.5 程序设计举例
mov ds,ax
mov cx,1000;设置最大的循环次数
mov bl,0
lea si,buffer
push bx
goon,mov dl,0dh
mov ah,2;输出回车符
int 21h
mov dl,0ah ;输出换行符
mov ah,2
int 21h
pop bx
mov al,bl;将要显示的数字赋给 al
微机原理及应用 —— 第4章 汇编语言 98
4.5 程序设计举例
inc al;
daa; 组合的十进制调整
cmp al,60h; AL增加到 60了吗
jc next;未达到,转去显示
mov al,0;已到 60,置为 0
next,mov bl,al
push bx;保存 bl值
mov dl,al
push cx
mov cl,4
shr al,cl
or al,30h;把 AL中十位数,转换为 ASCII码
mov [ si],al; 十位数 ASCII码后放入缓存微机原理及应用 —— 第4章 汇编语言 99
4.5 程序设计举例
inc si;缓存指针加 1
mov al,dl
and al,0fh
or al,30h;把 AL中的个位数,转换为 ASCII码
mov [ si],al; 个位数 ASCII码放入缓存
inc si ;缓存指针加 1
mov al,′$ ′
mov [ si],al
mov dx,offset buffer ;输出字符串
mov ah,9
int 21h
微机原理及应用 —— 第4章 汇编语言 100
4.5 程序设计举例
mov cx,0ffffh
again,dec cx
jne again;若不为 0,则跳转 again
pop cx; CX恢复为初值 1000
dec cx
je done;若 CX为 0,则转 done
mov si,offset buffer
jmp goon
done,ret
Start endp
code ends
end begin
微机原理及应用 —— 第4章 汇编语言 101
附:返回 DOS方法 (1)
Main PROC FAR
begin,push ds ;
mov ax,0
push ax
……
RET
微机原理及应用 —— 第4章 汇编语言 102
附:返回 DOS方法 (1)
程序的前 256字节称为程序段前缀 PSP(用户程序名、程序长度,标明用户程序特点)。我们写的程序代码紧跟在这 256字节之后,DS在程序装入后是指向这个 PSP的首址,这时 PSP
的首址是 DS:0000,之后在使用 DS前必须重新赋值。 将 DS和 0000压栈实际就是为了能返回到 PSP的首址 。程序执行完后由 RET完成将
DS和 0000弹出到 CS和 IP,这样,将执行 PSP
首址的代码,而那里是一条 INT 20H指令,
返回到 DOS
微机原理及应用 —— 第4章 汇编语言 103
附:返回 DOS方法 (2)
MOVAH,4CH
INT21H ;返回 DOS
微机原理及应用 —— 第4章 汇编语言 104
4.码制转换十、二进制数,ASCII码之间的互相转换。
① BCD数 → 2进制数算法,Dn-1*10n-1+……+D0*10 0
= (…(D n-1*10+ Dn-2)*10+…)*10+ D 0
= (…(( 0*10+Dn-1)*10+ Dn-2)*10+…)*10+ D 0
即,新的中间结果 = 中间结果 *10+本位数字
(中间结果初值为 0)
附:自学程序微机原理及应用 —— 第4章 汇编语言 105
程序 1:将 ≤65535的非压缩 BCD数转换成 2进制数。程序如下。;数据段定义
mydata SEGMENT
decnum DB 5,3,0,1,9 ;BCD数 53019
binnum DW?
mydata ENDS
微机原理及应用 —— 第4章 汇编语言 106
prog SEGMENT
ASSUME CS:prog,DS:mydata
begin,MOV AX,mydata
MOV DS,AX
MOV SI,OFFSET decnum
MOV CX,5 ;5位 BCD数
MOV BX,10
XOR AX,AX ;中间结果初始值为 0
Next,MUL BX ;中间结果 *10+本位数字
ADD AL,[SI]
ADC AH,0
INC SI ;指向下位 BCD数
LOOP next
MOV binnum,AX ;保存结果
MOV AH,4CH
INT 21H
prog ENDS
END begin
微机原理及应用 —— 第4章 汇编语言 107
例:从键盘输入两个整数,并求其和。
因键入为整数,故要进行如下转换:
ASCII→BCD→ 二进制数
ASCII→BCD 码很简单,高 4位清零即可得到非压缩的 BCD码。
BCD→ 二进制数在本例中采用用以下方法:
((((0+千位数 )*10+百位数 )*10)+十位数 )*10+个位数
② ASCII码 → 二进制数 (用于输入 )
第一次中间结果第二次中间结果第三次中间结果最终结果微机原理及应用 —— 第4章 汇编语言 108
开始两个数分别转换成二进制数键入两个数相加结束返回 DOS
如有溢出则提示开始取第一个 ASCII码是负号吗?
数字符个数- 1,指针+ 1
指针定位字符个数- 1
= 0?
取数字,与中间结果相加,再乘以 10
指向下一个数字字符加个位数是负数则求补存结果结束
N
Y
Y
N
转换子程序微机原理及应用 —— 第4章 汇编语言 109
程序如下:
DATA SEGMENT
STR1 DB 10,?,10 DUP(?) ;第 1个数的输入缓冲区
STR2 DB 10,?,10 DUP(?) ;第 2个数的输入缓冲区
NUM DW?,? ;存转换后的二进制数
SUM DW 0 ;存和
OVER DB ‘Overflow!’,13,10,’$’
DATA ENDS;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
微机原理及应用 —— 第4章 汇编语言 110
START,MOV AX,DATA
MOV DS,AX
MOV AH,0AH
LEA DX,STR1
INT 21H ;输入第一个数字串 (设为 26)
MOV AH,0AH
LEA DX,STR2
INT 21H ;输入第二个数字串 (设为 33)
LEA BX,STR1 ;串 1的首地址送 BX
LEA DI,NUM ;存二进制首地址送 DI
CALL CHANGE ;将串 1 ASCII码 → 二进制
LEA BX,STR2 ;串 2的首地址送 BX
微机原理及应用 —— 第4章 汇编语言 111
LEA DI,NUM+2 ;指向
CALL CHANGE ;将串 2 ASCII码 → 二进制
MOV AX,NUM ;(AX)=[NUM]=001AH
ADD AX,NUM+2 ;两数相加,(AX)=003BH
MOV SUM,AX ;存和
JNO NEXT ;无溢出,转 NEXT
LEA DX,OVER
MOV AH,9
INT 21H ;显示 ’ Overflow!’
NEXT,MOV AH,4CH
INT 21H ;返回 DOS
MAIN ENDP
微机原理及应用 —— 第4章 汇编语言 112
CHANGE PROC
MOV CL,[BX+1] ;实际字符数送 CL
MOV AL,[BX+2] ;第一个字符送 AL
MOV CH,AL ;暂存在 CH
CMP AL,’-’ ;第一个字符是负号吗?
JNZ NEXT1 ;不是,转 NEXT1
DEC CL ;字符数减 1
INC BX
NEXT1,ADD BX,2 ;指向第一个数字字符
MOV AX,0 ;清零 AX,存二进制数
LP1,DEC CL
JZ NEXT2 ;若 (CL)=0,转 NEXT2
MOV DL,[BX] ;取字符
AND DL,0FH ;转换成 BCD码
ADD AL,DL ;加到中间结果上
ADC AH,0
微机原理及应用 —— 第4章 汇编语言 113
MOV DX,10
MUL DX ;*10
INC BX ;指向下一个字符
JMP SHORT LP1
NEXT2,MOV DL,[BX] ;取个位数
AND DL,0FH ;个位 ASCII→ 未组合 BCD
ADD AX,DX ;加个位数,(AX)=001AH
CMP CH,’-’ ;是 ’ -’?
JNZ NEXT3 ;该数非负,转 NEXT3
NEG AX ;若为负,求补
NEXT3,MOV [DI],AX ;存二进制结果
RET
CHANGE ENDP;
CODE ENDS
END START
微机原理及应用 —— 第4章 汇编语言 114
02
0A
32
36
0D
…
02
0A
33
33
0D
…
00
1A
21
00
3B
00
STR1
STR2
NUM
SUM
10个
10个
‘ O’
…
…
OVER
04
0A
31
32
34
…
STR1
若键入 ‘ 1234’
33
0D
‘ 1’
‘ 2’
‘ 3’
‘ 4’
…
设键入第 1个数为 26,第 2个数为 33,则在内存各变量分配如下,
微机原理及应用 —— 第4章 汇编语言 115
本例题重点掌握,
*如何从键盘输入一个字符串
* ASCII→ 未组合 BCD→ 二进制
*有符号数的运算,对负数和溢出如何处理思考题,
若键入第一个数 26,第二个数为 -4,填写各变量结果 。