第三章第10节汇编程序常用伪指令简介
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个段地址 一个偏移地址 两个字符 0~65535之间的无符号数 -32768~+32767之间的带符号数
第3章 segment data ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
第4 章
保留字
保留字(Reserved Word)是汇编程序已
经利用的标识符,主要有: 硬指令助记符类——例如:MOV、ADD 伪指令助记符类——例如:DB、EQU 操作符——例如:OFFSET、PTR 寄存器名——例如:AX、CS 预定义符号——例如:@data
汇编语言大小写不敏感
第3 章 ⑴ 执行性语句——由硬指令构成的语句,它通常对应 一条机器指令,出现在程序的代码段中: 标号: 硬指令助记符 目的操作数, 源操作数;注释 前面章节已讲过
⑵ 说明性语句——由伪指令构成的语句,它通 常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,… ;注释
MOV CX,0 DELAY: NOP
第3章 一:(硬)指令语句和伪指令语句
硬指令——使CPU产生动作、并在程序执
行时才处理的语句,就是前面第 3 章学习 的处理器指令,汇编时会生成目标代码 伪指令( Directive ) —— 不产生 CPU 动 作、在程序执行前由汇编程序处理的说明 性语句,例如,数据说明、变量定义等等 伪指令与具体的处理器类型无关,但与汇 编程序的版本有关,即;伪指令语句只为 汇编程序提供汇编时所需的信息,而本身 不会生成目标代码
第3 章
3.10 汇编程序常用伪指令
汇编语言是用指令的助记符、符号地址、
标号等书写程序的语言,用汇编语言编 写的程序称为汇编语言源程序。把汇编 语言源程序翻译成机器语言程序(目标 程序)的过程称为汇编。完成汇编任务 的程序称为汇编程序。 在基本汇编的基础上进一步允许在源 程序中把一个指令序列定义为一条宏指 令的汇编程序叫做宏汇编
第3 章
字变量和字常量的定义: WNUM EQU 5678H ;定义WNUM为常量 COUNT DW 20H ;定义COUNT是赋了初值的变量,假设在数据段的 有效偏移地址为10H.字变量和字常量的应用: MOV AX,[BX+SI+WNUM] ; MOV AX,[BX+SI+5678H] MOV AX,COUNT ; MOV AX,[0010H] ; AX=0020H MOV AX,[SI+COUNT] ; MOV AX,COUNT[SI] ; MOV AX,[SI+20H] LEA BX,COUNT ; LEA BX,[0010H] MOV BX,OFFSET COUNT ; MOV BX,0010H
第3 章 3 . 1 0 . 2
伪 指 令 中
参 数 、 变 量 和 标 号
1.汇编伪指令的标号; 不能以数字0~9开头
不能以保留字开头
字母不区分大小写
标号和语句之间不能有‘:’
第4 3章
(1)
2.符号定义语句
用符号来表示一个指定的常数或数值表达式即为常 量标号,这种伪指令的格式是在符号与常数之间用“ =” 或者“EQU”连接(等值语句)如: NUM1 EQU 78H ;将78H赋值给NUM1 CONT1 = 96 ;将60H赋值给CONT1 CONT2 = 28H+NUM1 ;将A0H赋值给CONT2 CONT3 EQU 2*CONT1 ;将C0H赋值给CONT3 常量标号是给某个数据取的名字,一经定义,汇编指令 中就可以使用这个名字,无需使用具体的数字 (2)解除语句PURGE 格式 PURGE 符号名1,符号名2,… 此语句本身没有符号名,被 PURGE 解除后的符号名可 以重新定义,例: PURGE NUM1, CONT1
第3 章
mov al,X ;此处X表示它的第1个数据,故AL←'a' dec X+1
;对X为始的第2个数据减1,故成为-6
mov Y,al
;现在Y这个字符串成为 'aBC'
定义字单元伪指令DW 第3 章
DW伪指令用于分配一个或多个字单 元,并可以将它们初始化为指定值 初值表中每个数据一定是字量 ( Word ),一个字单元可用于存放任 何16位数据:
第3 章
变量名
变量名为用户自定义标识符,表示初
值表首元素的逻辑地址;用这个符号 表示地址,常称为符号地址 变量名可以没有。这种情况,汇编程 序将直接为初值表分配空间,无符号 地址 设置变量名是为了方便存取它指示的 存储单元
第3 章
初始值可以是确定的值或字符串 DATA1 DW 9999H DATA2 DB ‘OK’ 初始值不确定而为任意值时则使用? DATA3 DD ? 简化定义过程可使用重复定义伪指令DUP,例如定义一
第3 章
3.变量(数据)定义伪指令
变量定义( Define )伪指令为变量申
请固定长度的存储空间,并可同时将 相应的存储单元初始化
变量名 伪指令助记符 初值表
变量定义伪指令最常使用
汇编语言规定有DB、DW、DD、DF、DQ、
DT
第3 章
变量定义伪指令助记符
变量定义伪指令根据申请的主存
空间单位分类 DB——定义字节伪指令 DW——定义字伪指令 DD——定义双字伪指令 DF——定义3字伪指令 DQ——定义4字伪指令 DT——定义10字节伪指令
STACK DSEG
DSEG ESEG ESEG CSEG
0000H 0003H 0005H 0008H 000AH
第3 章
000BH BE 0000 MOV SI, OFFSET 000EH BF 0000 MOV DI, OFFSET 0011H B9 6400 MOV CX,100 0014H AD LOP1: LODSW 0015H 260305 ADD AX,ES:[DI] 0018H AB STOSW 0019H E2F9 LOOP LOP1 001BH B4 4C MOV AH,4CH 001DH CD 21 INT 21H MAIN ENDP CSEG ENDS END MAIN
来自百度文库
个拥有256个存储单元的字节型数据缓冲区BUFFB,初 值均为0 BUFFB DB 256 DUP(0) 简化定义过程,可以在一条伪指令中用逗号分隔而构成 任意组合序列 BUFFB DB 0,0,’ABC’,?,? , 0FFH
第3 章
初值表
初值表是用逗号分隔的参数 主要由数值常数、表达式或?、 变量中重复数据的定义格式: 符号名 Dn 表达式1 DUP(表达式) 表达式1:数据重复的次数 圆括弧内表达式:要重复的内容 ?——表示初值不确定,即未赋初值;
第3 章
3.10.1汇编语言的格式
例 3.10.1:用重复加法的方法实现乘法运算的子程序 STACK SEGMENT PARA STACK ;堆栈段开始 DB 64 DUP(?) ;堆栈段空间为100个字节 STACK ENDS ;堆栈段结束 MYDATA SEGMENT PARA ‘STACK’ ;数据段开始 NUM1 DB 2AH ;数据段放的数据 NUM2 DB 78H PRODUPCT DW ? ;数据缓冲区 MYDATA ENDS ;数据段结束 MYCODE SEGMENT ;代码段开始 ASSUME CS:MYCODE DS:MYDATA ;指明代码段、数据段 SS:STACK ;堆栈段段名 MYPROC PROC FAR ;定义过程 PUSH DS ;DS进栈 SUB AX,AX ;AX清零 PUSH AX ; AX进栈 MOV AX,SEG MYDATA ;段地址送AX MOV DS,AX ; AX送DS
第3 章
K: MYPROC MYCODE
SUB AX,AX ; AX清零 MOV CX,AX ; CX清零 MOV CL,NUM2 ;数据送CL DEC CL ; CL—1 MOV AL,NUM1 ;数据送AL ADD AL, NUM1 ; AL+ NUM1送AL ADC AH,00H ;进位送AH LOOP K ; K循环,次数由CX决定 MOV PRODUCT ,AX;结果送AX RET ;调用返回 ENDP ;过程结束 ENDS ;代码段结束 END MYPROC ;程序结束
第4 章
标号、名字与标识符
标号是反映硬指令位置(逻辑地址)的标识
符,后跟一个冒号“ :”分隔 名字是反映伪指令位置(逻辑地址)和属性 的标识符,后跟空格或制表符分隔,没有冒 号“:” 标识符(Identifier )一般最多由 31个字母、 数字及规定的特殊符号(如 _ 、 $ 、 ? 、 @ ) 组成,不能以数字开头。默认情况下,汇编 程序不区别标识符中的字母大小写 一个程序中,每个标识符的定义是唯一的, 还不能书写成汇编语言采用的保留字
;传送指令,具有2个操作数
;空操作指令,没有操作数,带有标号 LOOP DELAY
;循环指令,标号DELAY说明转移位置
BUFFER DB 1,2,3,4,5,6,7;数据定义伪指令,在主存中
开辟7 个连续的字节单元,初值依次为1 ~7 ,BUFFER 表示首地址,即段地址和偏移地址,具有赋过初值的变量的 意义,由汇编程序自动给出。
定义字节单元伪指令DB 第3 章
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
第3 章 data X Y data segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
第3 章
STACK
例4.2假设LISTA与LISTB为两个字类型数组,将他们 各对应相加,其和放在LISTB数组中,程序设计如下:
SEGMENT ;堆栈段开始 DW 32H DUP(?) ;堆栈段空间为40个字 ENDS ;堆栈段结束 SEGMENT ;数据段开始 LISTA DW 64H DUP(1234H) ;100字的源缓冲区 ENDS ;数据段结束 SEGMENT ;附加段开始 LISTB DW 100 DUP (432H1) ; 100字的目的缓冲区 ENDS ;附加段结束 SEGMENT ;代码段开始 ASSUME CS:CSEG DS:DSEG;指明代码段、数据段段名 ASSUME SS:STACK ES:ESEG ;堆栈段、附加段段名 MAIN PROC ;定义过程 B8 9014 MOV AX,DSEG ;数据段段地址送AX 8ED8 MOV DS, AX ;数据段段地址装入DS B8 9D14 MOV AX, ESEG ;附加段段地址送AX 8EC0 MOV ES, AX ;附加段段地址装入ES FC CLD ; 选择地址增方向
LISTA ; 指向源块的首地址 LISTB ; 指向目的块的首地址 ;循环次数 ; LISTA元素送AX ;将LISTB元素加到AX ;两数之和存入LISTB ;循环至CX=0 ;功能调用号4CH送入AH ;程序结束后返回DOS ;过程结束 ;代码段结束 ;程序结束
第3 章
举例程序得出结论
(1) 源程序一般由n个段构成,理论上讲可以有很多,但实际 上8086/8088规定不超出16段。每个段都以 SEGMEN语句开 始,以ENDS语句结束。程序中第一段称为 STACK(堆栈段), 它用来在存储器的某个地方建立一个栈区;第二段称为 DATA (数据段),它在存储器中放了被乘数,乘数的数据,第三段 称为CODE (代码段),其中包括了许多以符号表示的指令用 于实现乘法运算。程序中出现了 SEGMEN 、ASSUME伪指令。 (2) ASSUME语句可使汇编程序知道CS、DS、SS、ES指向 那个段地址,它在汇编时起作用,在运行时CPU不知道除CS外 的其他段地址,所以必须在程序中用指令进行赋值。 (3)所有过程(用RROC语句定义)必须用过程结束语句 ( ENDP)结束。整个源程序也必须用结束语句( END)来结 束。 汇编程序有三种基本语句构成:(硬)指令语句,(说明) 伪指令语句,(说明)宏指令语句。 ( 4 )程序开始必须申明(装入)各段寄存器的值,即各段地址 的值
第3章 segment data ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
第4 章
保留字
保留字(Reserved Word)是汇编程序已
经利用的标识符,主要有: 硬指令助记符类——例如:MOV、ADD 伪指令助记符类——例如:DB、EQU 操作符——例如:OFFSET、PTR 寄存器名——例如:AX、CS 预定义符号——例如:@data
汇编语言大小写不敏感
第3 章 ⑴ 执行性语句——由硬指令构成的语句,它通常对应 一条机器指令,出现在程序的代码段中: 标号: 硬指令助记符 目的操作数, 源操作数;注释 前面章节已讲过
⑵ 说明性语句——由伪指令构成的语句,它通 常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,… ;注释
MOV CX,0 DELAY: NOP
第3章 一:(硬)指令语句和伪指令语句
硬指令——使CPU产生动作、并在程序执
行时才处理的语句,就是前面第 3 章学习 的处理器指令,汇编时会生成目标代码 伪指令( Directive ) —— 不产生 CPU 动 作、在程序执行前由汇编程序处理的说明 性语句,例如,数据说明、变量定义等等 伪指令与具体的处理器类型无关,但与汇 编程序的版本有关,即;伪指令语句只为 汇编程序提供汇编时所需的信息,而本身 不会生成目标代码
第3 章
3.10 汇编程序常用伪指令
汇编语言是用指令的助记符、符号地址、
标号等书写程序的语言,用汇编语言编 写的程序称为汇编语言源程序。把汇编 语言源程序翻译成机器语言程序(目标 程序)的过程称为汇编。完成汇编任务 的程序称为汇编程序。 在基本汇编的基础上进一步允许在源 程序中把一个指令序列定义为一条宏指 令的汇编程序叫做宏汇编
第3 章
字变量和字常量的定义: WNUM EQU 5678H ;定义WNUM为常量 COUNT DW 20H ;定义COUNT是赋了初值的变量,假设在数据段的 有效偏移地址为10H.字变量和字常量的应用: MOV AX,[BX+SI+WNUM] ; MOV AX,[BX+SI+5678H] MOV AX,COUNT ; MOV AX,[0010H] ; AX=0020H MOV AX,[SI+COUNT] ; MOV AX,COUNT[SI] ; MOV AX,[SI+20H] LEA BX,COUNT ; LEA BX,[0010H] MOV BX,OFFSET COUNT ; MOV BX,0010H
第3 章 3 . 1 0 . 2
伪 指 令 中
参 数 、 变 量 和 标 号
1.汇编伪指令的标号; 不能以数字0~9开头
不能以保留字开头
字母不区分大小写
标号和语句之间不能有‘:’
第4 3章
(1)
2.符号定义语句
用符号来表示一个指定的常数或数值表达式即为常 量标号,这种伪指令的格式是在符号与常数之间用“ =” 或者“EQU”连接(等值语句)如: NUM1 EQU 78H ;将78H赋值给NUM1 CONT1 = 96 ;将60H赋值给CONT1 CONT2 = 28H+NUM1 ;将A0H赋值给CONT2 CONT3 EQU 2*CONT1 ;将C0H赋值给CONT3 常量标号是给某个数据取的名字,一经定义,汇编指令 中就可以使用这个名字,无需使用具体的数字 (2)解除语句PURGE 格式 PURGE 符号名1,符号名2,… 此语句本身没有符号名,被 PURGE 解除后的符号名可 以重新定义,例: PURGE NUM1, CONT1
第3 章
mov al,X ;此处X表示它的第1个数据,故AL←'a' dec X+1
;对X为始的第2个数据减1,故成为-6
mov Y,al
;现在Y这个字符串成为 'aBC'
定义字单元伪指令DW 第3 章
DW伪指令用于分配一个或多个字单 元,并可以将它们初始化为指定值 初值表中每个数据一定是字量 ( Word ),一个字单元可用于存放任 何16位数据:
第3 章
变量名
变量名为用户自定义标识符,表示初
值表首元素的逻辑地址;用这个符号 表示地址,常称为符号地址 变量名可以没有。这种情况,汇编程 序将直接为初值表分配空间,无符号 地址 设置变量名是为了方便存取它指示的 存储单元
第3 章
初始值可以是确定的值或字符串 DATA1 DW 9999H DATA2 DB ‘OK’ 初始值不确定而为任意值时则使用? DATA3 DD ? 简化定义过程可使用重复定义伪指令DUP,例如定义一
第3 章
3.变量(数据)定义伪指令
变量定义( Define )伪指令为变量申
请固定长度的存储空间,并可同时将 相应的存储单元初始化
变量名 伪指令助记符 初值表
变量定义伪指令最常使用
汇编语言规定有DB、DW、DD、DF、DQ、
DT
第3 章
变量定义伪指令助记符
变量定义伪指令根据申请的主存
空间单位分类 DB——定义字节伪指令 DW——定义字伪指令 DD——定义双字伪指令 DF——定义3字伪指令 DQ——定义4字伪指令 DT——定义10字节伪指令
STACK DSEG
DSEG ESEG ESEG CSEG
0000H 0003H 0005H 0008H 000AH
第3 章
000BH BE 0000 MOV SI, OFFSET 000EH BF 0000 MOV DI, OFFSET 0011H B9 6400 MOV CX,100 0014H AD LOP1: LODSW 0015H 260305 ADD AX,ES:[DI] 0018H AB STOSW 0019H E2F9 LOOP LOP1 001BH B4 4C MOV AH,4CH 001DH CD 21 INT 21H MAIN ENDP CSEG ENDS END MAIN
来自百度文库
个拥有256个存储单元的字节型数据缓冲区BUFFB,初 值均为0 BUFFB DB 256 DUP(0) 简化定义过程,可以在一条伪指令中用逗号分隔而构成 任意组合序列 BUFFB DB 0,0,’ABC’,?,? , 0FFH
第3 章
初值表
初值表是用逗号分隔的参数 主要由数值常数、表达式或?、 变量中重复数据的定义格式: 符号名 Dn 表达式1 DUP(表达式) 表达式1:数据重复的次数 圆括弧内表达式:要重复的内容 ?——表示初值不确定,即未赋初值;
第3 章
3.10.1汇编语言的格式
例 3.10.1:用重复加法的方法实现乘法运算的子程序 STACK SEGMENT PARA STACK ;堆栈段开始 DB 64 DUP(?) ;堆栈段空间为100个字节 STACK ENDS ;堆栈段结束 MYDATA SEGMENT PARA ‘STACK’ ;数据段开始 NUM1 DB 2AH ;数据段放的数据 NUM2 DB 78H PRODUPCT DW ? ;数据缓冲区 MYDATA ENDS ;数据段结束 MYCODE SEGMENT ;代码段开始 ASSUME CS:MYCODE DS:MYDATA ;指明代码段、数据段 SS:STACK ;堆栈段段名 MYPROC PROC FAR ;定义过程 PUSH DS ;DS进栈 SUB AX,AX ;AX清零 PUSH AX ; AX进栈 MOV AX,SEG MYDATA ;段地址送AX MOV DS,AX ; AX送DS
第3 章
K: MYPROC MYCODE
SUB AX,AX ; AX清零 MOV CX,AX ; CX清零 MOV CL,NUM2 ;数据送CL DEC CL ; CL—1 MOV AL,NUM1 ;数据送AL ADD AL, NUM1 ; AL+ NUM1送AL ADC AH,00H ;进位送AH LOOP K ; K循环,次数由CX决定 MOV PRODUCT ,AX;结果送AX RET ;调用返回 ENDP ;过程结束 ENDS ;代码段结束 END MYPROC ;程序结束
第4 章
标号、名字与标识符
标号是反映硬指令位置(逻辑地址)的标识
符,后跟一个冒号“ :”分隔 名字是反映伪指令位置(逻辑地址)和属性 的标识符,后跟空格或制表符分隔,没有冒 号“:” 标识符(Identifier )一般最多由 31个字母、 数字及规定的特殊符号(如 _ 、 $ 、 ? 、 @ ) 组成,不能以数字开头。默认情况下,汇编 程序不区别标识符中的字母大小写 一个程序中,每个标识符的定义是唯一的, 还不能书写成汇编语言采用的保留字
;传送指令,具有2个操作数
;空操作指令,没有操作数,带有标号 LOOP DELAY
;循环指令,标号DELAY说明转移位置
BUFFER DB 1,2,3,4,5,6,7;数据定义伪指令,在主存中
开辟7 个连续的字节单元,初值依次为1 ~7 ,BUFFER 表示首地址,即段地址和偏移地址,具有赋过初值的变量的 意义,由汇编程序自动给出。
定义字节单元伪指令DB 第3 章
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
第3 章 data X Y data segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
第3 章
STACK
例4.2假设LISTA与LISTB为两个字类型数组,将他们 各对应相加,其和放在LISTB数组中,程序设计如下:
SEGMENT ;堆栈段开始 DW 32H DUP(?) ;堆栈段空间为40个字 ENDS ;堆栈段结束 SEGMENT ;数据段开始 LISTA DW 64H DUP(1234H) ;100字的源缓冲区 ENDS ;数据段结束 SEGMENT ;附加段开始 LISTB DW 100 DUP (432H1) ; 100字的目的缓冲区 ENDS ;附加段结束 SEGMENT ;代码段开始 ASSUME CS:CSEG DS:DSEG;指明代码段、数据段段名 ASSUME SS:STACK ES:ESEG ;堆栈段、附加段段名 MAIN PROC ;定义过程 B8 9014 MOV AX,DSEG ;数据段段地址送AX 8ED8 MOV DS, AX ;数据段段地址装入DS B8 9D14 MOV AX, ESEG ;附加段段地址送AX 8EC0 MOV ES, AX ;附加段段地址装入ES FC CLD ; 选择地址增方向
LISTA ; 指向源块的首地址 LISTB ; 指向目的块的首地址 ;循环次数 ; LISTA元素送AX ;将LISTB元素加到AX ;两数之和存入LISTB ;循环至CX=0 ;功能调用号4CH送入AH ;程序结束后返回DOS ;过程结束 ;代码段结束 ;程序结束
第3 章
举例程序得出结论
(1) 源程序一般由n个段构成,理论上讲可以有很多,但实际 上8086/8088规定不超出16段。每个段都以 SEGMEN语句开 始,以ENDS语句结束。程序中第一段称为 STACK(堆栈段), 它用来在存储器的某个地方建立一个栈区;第二段称为 DATA (数据段),它在存储器中放了被乘数,乘数的数据,第三段 称为CODE (代码段),其中包括了许多以符号表示的指令用 于实现乘法运算。程序中出现了 SEGMEN 、ASSUME伪指令。 (2) ASSUME语句可使汇编程序知道CS、DS、SS、ES指向 那个段地址,它在汇编时起作用,在运行时CPU不知道除CS外 的其他段地址,所以必须在程序中用指令进行赋值。 (3)所有过程(用RROC语句定义)必须用过程结束语句 ( ENDP)结束。整个源程序也必须用结束语句( END)来结 束。 汇编程序有三种基本语句构成:(硬)指令语句,(说明) 伪指令语句,(说明)宏指令语句。 ( 4 )程序开始必须申明(装入)各段寄存器的值,即各段地址 的值