微机课件_04第四章:汇编程序设计
合集下载
微机原理与应用-04 汇编语言
例:把片外RAM2200H单元中的数送入片内70H单元中。
BEGIN:MOV
MOV MOVX MOV
13
DPTR,#2200H ;(DPTR)=2200H
R0,#70H A,@DPTR @R0,A
南京航空航天大学机电学院机械电子工程系 2005年
《微机原理及应用》课件
1、标号字段
后必跟“ :”号; 首字符必是字母,由1~8个ASCII 码 字符组成; 同一标号在一个程序中只能定义一次; 不能使用指令助记符、伪指令、寄存器 的符号名称; 一条语句的标号可有可无,取决于本程 序的其他语句是否访问该条语句。
《微机原理及应用》课件
(2) 机器汇编
汇编语言 源程序
汇编
机器语言 目标程序
汇编程序
用机器汇编,方便快捷,并能在汇 编过程中发现语法错误。
8
南京航空航天大学机电学院机械电子工程系 2005年
《微机原理及应用》课件
Medwin汇编环境示例
9
南京航空航天大学机电学院机械电子工程系 2005年
《微机原理及应用》课件
《微机原理及应用》课件
2. 汇编语言
面向机器的符号语言,指令用助记符表示; 指令直接访问CPU的寄存器、存储单元和 I/O端口,响应速度快,程序的存储空间 利用较高; 汇编语言是面向机器的语言,因此使用者 必须对机器的硬件结构和指令系统比较熟 悉。
5
南京航空航天大学机电学院机械电子工程系 2005年
33
南京航空航天大学机电学院机械电子工程系 2005年
《微机原理及应用》课件
(2)子程序的参数传递
a. 利用寄存器(R0~R7和A)传递参数
微机原理课件第四章 汇编语言程序设计
9
4-1 汇编语言程序格式
MASM中可使用的语句分成两类:指令性语句和伪指令语句。 一、指令性语句 • 特点:与机器指令相对应,汇编时产生目标代码。 • 标号:指令助记符 操作数,操作数 ;注释 ①标号:表示本指令语句的符号地址,后跟冒号“:”,用 作转移的目标地址; ②指令助记符:指出指令的操作类型,由英文字母缩写而成; ③操作数:指明参加指令运算的数据,有无操作数、单操作 数和双操作数之分,其中双操作数之间用逗号“,”分隔, 操作数与指令助记符之间用空格隔开; ④注释:用来说明一条指令或一段程序的功能,前面以分号 “;”为标记,汇编程序对注释不进行汇编,增加可读性 • 其中指令助记符是关键字,不可省略,其余部分均可省略。
20
例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX, WORD PTR N1 执行后:AX=3615H MOV BL, BYTE PTR N2 执行后:BL=22H MOV AX, WORD PTR N1+1 执行后:AX=2236H 注:若符号地址出现在操作数中,其类型为DB、DW所定义的 类型(如直接寻址、寄存器相对寻址、相对基址变址寻 址),如类型不匹配汇编时提示Warning Error:Operand types must match 或 Illegal size for operand;若存 储器操作数中不包含符号地址(如寄存器间接寻址等), 则该操作数的类型不确定,指令中的另一操作数必须明确 类型,否则汇编时提示Severe Error:Operand must have size. 例:LEA BX,N1之后 CMP [BX],10H 或 INC [BX]均出错。
10
二、伪指令语句 • 特点:没有对应的机器指令(本身不产生目标代码),只 为汇编程序提供汇编信息。 • 格式: 名字 伪指令指示符 操作数,操作数 ;注释 ①名字:给伪指令取的名称,用符号地址表示,名字后不带 冒号“:”,只用空格符与伪指令指示符相分隔; ②伪指令指示符:是MASM规定的符号,明确不同的操作; ③操作数:规定同指令性语句,区别在于操作数可能多于2 个; ④注释:规定同指令性语句 • 其中不可省略的部分是伪指令指示符,其余均可缺省。 三、数据项 • 操作数的三种基本数据项:常数、变量、标号
4-1 汇编语言程序格式
MASM中可使用的语句分成两类:指令性语句和伪指令语句。 一、指令性语句 • 特点:与机器指令相对应,汇编时产生目标代码。 • 标号:指令助记符 操作数,操作数 ;注释 ①标号:表示本指令语句的符号地址,后跟冒号“:”,用 作转移的目标地址; ②指令助记符:指出指令的操作类型,由英文字母缩写而成; ③操作数:指明参加指令运算的数据,有无操作数、单操作 数和双操作数之分,其中双操作数之间用逗号“,”分隔, 操作数与指令助记符之间用空格隔开; ④注释:用来说明一条指令或一段程序的功能,前面以分号 “;”为标记,汇编程序对注释不进行汇编,增加可读性 • 其中指令助记符是关键字,不可省略,其余部分均可省略。
20
例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX, WORD PTR N1 执行后:AX=3615H MOV BL, BYTE PTR N2 执行后:BL=22H MOV AX, WORD PTR N1+1 执行后:AX=2236H 注:若符号地址出现在操作数中,其类型为DB、DW所定义的 类型(如直接寻址、寄存器相对寻址、相对基址变址寻 址),如类型不匹配汇编时提示Warning Error:Operand types must match 或 Illegal size for operand;若存 储器操作数中不包含符号地址(如寄存器间接寻址等), 则该操作数的类型不确定,指令中的另一操作数必须明确 类型,否则汇编时提示Severe Error:Operand must have size. 例:LEA BX,N1之后 CMP [BX],10H 或 INC [BX]均出错。
10
二、伪指令语句 • 特点:没有对应的机器指令(本身不产生目标代码),只 为汇编程序提供汇编信息。 • 格式: 名字 伪指令指示符 操作数,操作数 ;注释 ①名字:给伪指令取的名称,用符号地址表示,名字后不带 冒号“:”,只用空格符与伪指令指示符相分隔; ②伪指令指示符:是MASM规定的符号,明确不同的操作; ③操作数:规定同指令性语句,区别在于操作数可能多于2 个; ④注释:规定同指令性语句 • 其中不可省略的部分是伪指令指示符,其余均可缺省。 三、数据项 • 操作数的三种基本数据项:常数、变量、标号
四章汇编语言程序设计ppt课件
指令助记符:MOV,ADD,…. 指示性(伪指令)操作符:DB,DW,SEGMENT,
ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
第4章汇编语言程序设计知识PPT课件
┇
(1500H)=72H, (1501H)=34H, (1502H)=00H,
(1503H)=8AH,(1504H)=00H, (1505H)=10H。
(1506H)=00H,(1507H)=48H (H的ASCII值)
第24页/共61页
§4.2 伪指令
7、DS 定义存储空间命 令
格式:DS 表达式 功能:在汇编时,从指定地址开始保留DS之后表达式的值所
第15页/共61页
§4.2 伪指令
1、ORG 汇编起始地址命令
格式:ORG 16位地址
功能:规定该伪指令后面程序的汇编地址,即汇编后生成目
标程序存放的起始地址。
例如:
ORG 2000H
START:MOV A,#64H
┇
规定了START的地址是2000H,又规定了汇编后的第一条指令 码从2000H开始存放。
§4.2 伪指令
例如:
ORG 2000H DB 0A3H
LIST:DB 26H,03H STR: DB ‘ABC’
┇
A3H 26H 03H 41H 42H 43H
2000H 2001H 2002H 2003H 2004H 2005H
经汇编后:(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H, (2004H)=42H, (2005H)=43H,
第31页/共61页
§4.4 汇编语言程序的基本结构
1、顺序程序 2、分支程序 3、循环程序
第32页/共61页
§4.4 汇编语言程序的基本结构
1、顺序程序
顺序程序是最简单的程序结构,也称直线程序。 程序按顺序一条一条地执行指令。这类程序是所有复杂程序的基础。 要写出高质量的程序还是需要掌握一定的技巧,需要熟悉指令系统,正确地选择 指令,最大限度地优化程序。
第4章汇编语言程序设计课件
29
MASTERLI
‘H’‘E’‘L’‘L’‘O’
例2:操作数可以是字符串MASTERLI DB ‘HELLO’汇编后如下:
注意下面的不同DB ‘AB’41 ‘A’ 42 ‘B’
‘AB’‘B’ ‘A’
42
41
DW
30
例3:ABC DB 0, 1, ?, ?, ?LPI DW ?, 54, ? 汇编后如下图示:
第4章 汇编语言程序设计4.1 汇编语言源程序机器语言—用二进制来表示指令和数据。B0 64 什么意思?这就是机器语言。既不直观, 又不易理解和记忆。MOVAL,64H ;大家很清楚,这就是助记符。助记符—反映指令的功能和主要特征,便于人们 理解和记忆。
1
指令除了操作码以外,还有一个操作数问题。操作数可能放在存储器中,这就涉及一个地址问 题。程序中遇到转移指令或调用指令,涉及地址转 移,若采用具体地址就不很方便,一旦有错,改动就 很麻烦。于是人们采用标号或符号来代替地址,例:LP1: …┇LOOP LP1汇编语言 是用助记符、符号地址以及标号等符号 书写的程序。用汇编语言编写的程序叫源程序。
18
(3) 关系运算符EQ(相等),NE(不等),LT(小于),GT(大于), LE(小于或等于),GE(大于或等于)。关系运算符的两个操作数必须都是数字或者是 同一段内的两个存储器地址。关系为真,结果为0FFFFH;关系为假,结果为0。例:MOV BX, PORT_VAL GE 5若PORT_VAL的值大于等于5,则汇编后为:MOV BX, 0FFFFH若PORT_VAL的值小于5,则汇编后为:
(4) 取值运算符和属性运算符:分析和规定存储器的属性。
20
若BUFFER1存储区是用如下伪指令定义的: BUFFER1 DB 100 DUP(?)则 TYPE BUFFER1等于1。
第04章 汇编语言程序设计 39页 0.2M PPT版
MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2
第4章汇编程序设计PPT课件
第7页/共70页
初值表
• 初值表是用逗号分隔的参数 • 主要由数值常数、表达式或?、DUP组成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
第8页/共70页
• 例如 BIGGEST DD 12345678H 在汇编时就会初始化,如图所示。它定义了一个双字变量,且给了初始值。
SEGMENT和ENDS语句把汇编语言源程序分 成段,这些段就相应于存储器段,在这些存储 器段中,存放相应段的目标码。
汇编程序必须知道程序的段结构,并知道 在各种指令执行时将访问哪一个段由段寄存器 所 指 向 。 这 个 信 息 是第1由7页A/共S70S页U M E 语 句 提 供 的 。
通常在汇编语言的源程序中,至少要定义 码段(指令段)、堆栈段和数据段,有时还要定 义附加段。每一个段必须有一个名称,如 MY_DATA、MY_CODE等。一个段由命令SEGMENT 开始,由命令ENDS结束,它们必须成对出现, 而且它们的语句中必须有名称,名称必须相同。 最后用语句END来结束整个源程序。
[分析]因为需要重复进行数据大小的比较,所 以可设计为循环程序结构形式,设计要点是: ①找出循环的规律;②确定控制循环的方法
第30页/共70页
• 参考程序:
DATA SEGMENT BUF DB 26, 78, 196, 45, 16, 9 CNT EQU $-BUF
DATA ENDS CODE SEGMENT
NAME1
SEGMENT
语句
┇
语句
NAME1
ENDS
NAME2
SEGMENT
语句
┇
语句
NAME2
ENDS
初值表
• 初值表是用逗号分隔的参数 • 主要由数值常数、表达式或?、DUP组成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
第8页/共70页
• 例如 BIGGEST DD 12345678H 在汇编时就会初始化,如图所示。它定义了一个双字变量,且给了初始值。
SEGMENT和ENDS语句把汇编语言源程序分 成段,这些段就相应于存储器段,在这些存储 器段中,存放相应段的目标码。
汇编程序必须知道程序的段结构,并知道 在各种指令执行时将访问哪一个段由段寄存器 所 指 向 。 这 个 信 息 是第1由7页A/共S70S页U M E 语 句 提 供 的 。
通常在汇编语言的源程序中,至少要定义 码段(指令段)、堆栈段和数据段,有时还要定 义附加段。每一个段必须有一个名称,如 MY_DATA、MY_CODE等。一个段由命令SEGMENT 开始,由命令ENDS结束,它们必须成对出现, 而且它们的语句中必须有名称,名称必须相同。 最后用语句END来结束整个源程序。
[分析]因为需要重复进行数据大小的比较,所 以可设计为循环程序结构形式,设计要点是: ①找出循环的规律;②确定控制循环的方法
第30页/共70页
• 参考程序:
DATA SEGMENT BUF DB 26, 78, 196, 45, 16, 9 CNT EQU $-BUF
DATA ENDS CODE SEGMENT
NAME1
SEGMENT
语句
┇
语句
NAME1
ENDS
NAME2
SEGMENT
语句
┇
语句
NAME2
ENDS
微机原理课件第4章 汇编语言程序设计
NEAR表示标号所在语句与转移指令(或调用 指令)在同一代码段内,跳转时只需改变IP。 FAR表示标号所在语句与转移指令(或调用 指令)不在同一代码段内。 若没有对类型进行说明,默认为NEAR。 备 注:标号常作为转移指令或CALL指令的转移地址
11
3、变量 变量用伪指令定义,变量名是内存单元的符号地址。 定义变量就是给变量分配内存单元。 变量也有三个属性:
只能出现在指令性语句中,标号后应加上冒号。
名 字:段、子程序、变量的名字,用来代表它们在存储
器中的地址;只能出现在指示性语句中,名字后 不加冒号。
助记符:指令助记符、伪指令 操作数:指令的操作对象
指令性语句 — 0,1,2个 指示性语句 — 根据需要确定 操作数之间以逗号隔开 操作数可以是寄存器、存储单元、常数或表达式
;汇编前的形式 ;汇编后的形式 ;设TAB偏移地址为1000H
15
2) 逻辑运算符:AND、OR、XOR、NOT
逻辑运算符只能用于数字表达式中。
例如:MOV CL,36H AND 0FH ; 汇编前
MOV CL,06H
; 汇编后
注意:不要把逻辑运算符与逻辑运算指令混淆
例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为3F00H,所以上述 指令与AND AX, 3F00H等价。
体的数值或地址,运行时不能改变。 ➢表达式中的运算符有6类:算术、逻辑、关系、
取地址、属性、杂类。
14
1) 算术运算符:+ - * / MOD
用于数字表达式 例:MOV AX,4*1024 ;汇编前的形式 MOV AX,4096 ;汇编后的形式
用于地址表达式 例: LEA SI,TAB+3 LEA SI,[1003H]
11
3、变量 变量用伪指令定义,变量名是内存单元的符号地址。 定义变量就是给变量分配内存单元。 变量也有三个属性:
只能出现在指令性语句中,标号后应加上冒号。
名 字:段、子程序、变量的名字,用来代表它们在存储
器中的地址;只能出现在指示性语句中,名字后 不加冒号。
助记符:指令助记符、伪指令 操作数:指令的操作对象
指令性语句 — 0,1,2个 指示性语句 — 根据需要确定 操作数之间以逗号隔开 操作数可以是寄存器、存储单元、常数或表达式
;汇编前的形式 ;汇编后的形式 ;设TAB偏移地址为1000H
15
2) 逻辑运算符:AND、OR、XOR、NOT
逻辑运算符只能用于数字表达式中。
例如:MOV CL,36H AND 0FH ; 汇编前
MOV CL,06H
; 汇编后
注意:不要把逻辑运算符与逻辑运算指令混淆
例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为3F00H,所以上述 指令与AND AX, 3F00H等价。
体的数值或地址,运行时不能改变。 ➢表达式中的运算符有6类:算术、逻辑、关系、
取地址、属性、杂类。
14
1) 算术运算符:+ - * / MOD
用于数字表达式 例:MOV AX,4*1024 ;汇编前的形式 MOV AX,4096 ;汇编后的形式
用于地址表达式 例: LEA SI,TAB+3 LEA SI,[1003H]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、表达式
• 由常数、变量或标号、运算符连接而成 • 分类:数字表达式、地址表达式 (1)运算符 DX, PORT AND 0FFH AND
算术运算符 逻辑运算符 +、-、*、/、mod AND、OR、NOT、XOR
关系运算符
EQ、NE、LT、LE、GT、GE
——注意与算术运算指令和逻辑运算指令的区别
DAA MOV RES,AX
3、分支结构
[例4-18] 求数X的绝对值,并送值回原处
STACK
STACK XADR
SEGMENT STACK
DW 256 ENDS DW 3456H, 8192H SEGMENT DUP(?)
定义了一个空栈
DATA SEGMENT
DATA ENDS
CODE
ASSUME CS:CODE,DS:DATA,SS:STACK
与第一条指令的标号相同; 必须是最后一条语句; 若有多个END语句,只有第一个有效。
(6)段寄存器设定伪指令
说明段寄存器和用户编写的段的对应关系, 表示出用户编写的段属于系统规定的哪个 段 一般设在代码段中 定义格式: ASSUME 段寄存器名:段名[, 段寄存器名:段名]
注意:该语句仅仅说明段寄存器和段的对应关系, 但不等于段基址已经装入了段寄存器
包含4个元素 每个元素的数据为0和1
数组实际所占空间和用SIZE求得数值不一定相同!
(2)符号定义伪指令
•
•
赋值伪指令:EQU 定义格式:符号名 EQU 表达式
• •
等号伪指令:= 定义格式:符号名 = 表达式
特点:都不直接产生机器指令 区别:赋值伪指令不可以重名
• •
举例:
COUNT = 5 ;常数 NUM= 13+5-4 ;数值表达式 NUM = NUM+1 ADR1 EQU DS:[BP+4] ;地址表达式 CREG EQU CX ;寄存器名 CBD EQU DAA ;指令名 L1 EQU SUBSTART;标号名 WO EQU WORD PTR DBYTE;变量名
+,EQ,NE,LT,LE,GT,GE 低 NOT > AND > OR > XOR SHORT
3.伪指令
指令语句 伪指令语句 宏指令语句
执行语句。经过汇编产生可供计 算机硬件执行的机器目标代码。
说明语句。如:程序有几个段, 段的名称,是否需要预留存储空 间等。不直接产生目标代码。 指令语句+伪指令语句。替代源 程序中一段有独立功能的程序, 汇编时产生相应的目标代码。
DATA SEGMENT 数据段定义变量 …… DATA ENDS • 汇编程序的结构框架 CODE SEGMENT 段寄存器定义 ASSUME CS:CODE, DS:DATA ;定义过程 …… START:MOV AX,DATA DS的装入 MOV DS,AX …… MOV AH,4CH 退出程序 INT 21H CODE ENDS END START
OFFSET 变量/标号 TYPE 变量/标号
LENGTH 变量 SIZE 变量
运算符SEG和OFFSET
•
•
SEG返回变量/标号的段基址 OFFSET返回变量/标号的段内偏移
举例: = MOV AX,0915H MOV AX,SEG K1 MOV BX,SEG ARRAY = MOV BX,0947H MOV BX,OFFSET ARRAY = MOV BX,0100H 变量K1所在段的段基址为0915H 变量ARRAY所在段的段基址为0947H,偏移为0100H
START:
MOV
MOV MOV AND JNS
AX, DATA
DS, AX AX, XADR AX, AX DONE
NEG
MOV DONE: CODE MOV INT ENDS
AX
XADR, AX AH, 4CH 21H
END START
4、循环结构
[例4-20]求某数据区内负数的个数 设数据区第一个单元存放数据个数,第二 单元开始存放数据,最后一个单元存放结 果。 STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:CODE
42H
41H STRING2
42H
41H 00H 00H STRING3
数据定义例——数组(1)
伪指令:DUP,重复赋值 格式:重复次数 DUP(操作数,…..,操作数) SUBB DW 1000 DUP (?)
包含1000数组元素 值不确定
SDKP
DB 2 DUP (0,2 DUP(1))
(3)段定义伪指令
•
•
把源程序划分成若干逻辑段,便于汇编程 序生产相应代码,便于连接程序生产可执 行程序。 一个汇编语言源程序可以包含若干个逻辑 段(代码段、数据段、附加段或堆栈段), 段与段之间的顺序可随意排列。需独立运 行的程序必须包含一个代码段,并指示程 序执行的起始点,一个程序只有一个起始 点。
C、C++、PASCAL语言 如:Turbo C、VC++、 DELPHI、GNU GCC
编译
汇编
中间语言
C#、JAVA
.NET、JVM
4.2 8086汇编语言介绍
1.数据 (1)常数
表示汇编过程中已经有确定数值的量,主要用于做指 令中的立即数、寻址中的位移量,或在伪指令语句中 给变量赋值。 数值常数:由二、八、十和十六进制表达的数
0101B 3247O 2873D 23ABH
字符串常数:用’ ’(或“ ”)括起来的一串ASCII码 字符,等效为一组数值常数
’12AB’ = 31H、32H、41H、42H
(2)变量
•
内存单元的数据,变量值在程序运行期间可以改 变。 需要事先定义,通过变量名引用。变量名表示变 量的首地址。 在数据段或附加段用数据定义伪指令定义。 变量的属性
2、顺序结构
[例4-15]把BUF开始的两个字节单元中的压 缩BCD数相加,结果存入字节单 元RES中 BCD码:为了让计算机能识别十进制数 例如:通常十进制数49在计算机中为31H, 不方便程序员观察和记忆,用 BCD码存放则直接为49H
buf db 89h,34h res dw ?
LEA BX,BUF ;BX为BUF的有效地址 MOV AL,BUF ;BUF中的第一个字节 ADD AL,[BX+1] ; [BX+1] 为BUF中的第二个字节
SIZE返回数组变量所占的总字节数
=LENGTH*TYPE
举例:
K1 K2 DB 10H DUP(0) DB “ABCDEF”
TYPE K1 = K2 = 1 TYPE 1 10 LENGTH K1 = LENGTH K2 = 1 SIZE K1 = 1*10=10 SIZE K2 = 1*1=1
第四章 汇编语言程序设计
南理工紫金学院 帅辉明本章重点Fra bibliotek汇编语言
数据和表达式 伪指令 语法
程序设计
顺序、分支、循环、子程序 DOS功能调用
4.1 程序设计语言概述
机器语言:由0、1代码所组成的语言。面向机器, 同一组代码对不同的计算机表示不同的含义。 汇编语言:由助记符表示的语言。面向机器。 高级语言:用一些接近人们书写习惯的英语和数 学表达式形式的句子编写程序。这种语言不面向 机器,而是面向过程、面向对象。
FBH DBYTE DWORD
12H
00H
34H
12H
00H
00H
DDWORD
数据定义例—字符串
STRING1 DB „AB‟ 一个字节变量,值为’A‟ STRING2 DW „AB‟ 一个字变量,值为‟AB‟ STRING3 DD „AB‟ 一个双字变量,值为’AB‟
41H 42H
STRING1
(3)属性运算符
类型修改运算符PTR 短转移运算符SHORT 段超越运算符 类型 PTR 地址表达式 JMP SHORT 标号 段名:地址表达式
(4)运算符优先级
优先级 高 段超越运算符 PTR,OFFSET,SEG,TYPE,THIS *,/,MOD,SHL,SHR 运算符 LENGTH,SIZE,[ ]
[名字] START:
操作码 [操作数] [注释] MOV AX,30H ; AX30H
名字
以字母开头,由字母、数字、特殊字符(?、*、_、$、 @等)组成,不超过31字符 不能与保留字相同 任选,多数指令不用,伪指令用 指令语句名字用“:”分界,伪指令语句用空格分界 标号名、变量名、常量名、过程名、段名等
举例:
MOV AX,VALUE MOD 7 ;VALUE=50
MOV AX, 1
MOV MOV
AL, NOT 0FH
MOV AL, F0H
AX, 0FH EQ 1111B
关系成立结果全为1否则全为0 MOV AX, FFFFH
(2)数值返回运算符
对存储单元的操作
段基址运算符SEG 偏移量运算符OFFSET 类型运算符TYPE 长度运算符LENGTH 字节总数运算符SIZE SEG 变量/标号
3.3 汇编语言程序设计
(7)过程定义伪指令
过程:具有一定功能的子程序,CALL调用 定义格式: 过程名 PROC[距离类型] ……ret 过程名 ENDP 注意:
过程和段可以互相嵌套,但不可交叉覆盖 每个过程一定有返回指令RET,可能有多个 最后一条指令必须是RET