DOS Windows汇编语言程序设计 第2章 第6节 硬指令和伪指令
汇编语言伪指令

汇编语言伪指令汇编语言作为一种低级编程语言,广泛应用于嵌入式系统、驱动程序开发和操作系统内核等领域。
在进行汇编语言编程时,我们常常会使用到一些伪指令。
本文将介绍一些常见的汇编语言伪指令及其用法。
1. 数据定义伪指令数据定义伪指令用于声明并初始化数据。
在汇编语言中,我们可以使用以下伪指令来定义不同类型的数据:1.1 DB(Define Byte):用于定义一个字节的数据。
例如:DB 10 ;定义一个字节的数据,值为101.2 DW(Define Word):用于定义一个字的数据。
例如:DW 100 ;定义一个字的数据,值为1001.3 DD(Define Doubleword):用于定义一个双字的数据。
例如:DD 1000 ;定义一个双字的数据,值为10001.4 DQ(Define Quadword):用于定义一个四字的数据。
例如:DQ 10000 ;定义一个四字的数据,值为100001.5 DT(Define Ten Bytes):用于定义一个十个字节的数据。
例如:DT 1234567890 ;定义一个十个字节的数据,值为12345678902. 代码段和数据段伪指令在汇编语言中,我们通常需要将代码和数据分开存放,以便于管理和执行。
以下是一些常用的代码段和数据段伪指令:2.1 CODE SEGMENT:用于定义代码段。
例如:CODE SEGMENT;代码段内容CODE ENDS2.2 DATA SEGMENT:用于定义数据段。
例如:DATA SEGMENT;数据段内容DATA ENDS2.3 STACK SEGMENT:用于定义堆栈段。
例如:STACK SEGMENT;堆栈段内容STACK ENDS3. 控制指令伪指令控制指令伪指令用于控制程序的执行流程。
以下是一些常见的控制指令伪指令:3.1 IF-ELSE-ENDIF:用于条件判断。
例如:IF 条件;条件为真时执行的代码ELSE;条件为假时执行的代码ENDIF3.2 REPEAT-UNTIL:用于循环执行一段代码直至满足条件。
伪指令和汇编语言

从指定单元开始,定义若干个字(双字节数)。
例如:
ORG 8000H
HETAB:
DW 7234H,8AH,10
汇编后则:
(8000H)=72H (8001H)=34H (8002H)=00H (8003H)=8AH (8004H)=00H (8005H)=0AH
03 常用旳伪指令
DS:定义空间命令
“DS <体现式>定义空间命令 格式: 标号: DS 数据或字符体现式 从指定单元开始,由数据或体现式 拟定保存若干个字节内存空间备用。 例如: ORG 8000H DS 08H DB 30H,8AH 即8000H~8007H单元保存备用 (8008H)=30H (8009H)=8AH
DATA和EQU旳区别在于DATA定义旳字符名称
作为标号登记在符号表中,故可先使用后定义;
而用EQU定义旳字符名称必须先定义后使用,其
原因是EQU不定义在符号表中。
03 常用旳伪指令
BIT:位地址符号命令
“
BIT<体现式>位地址符号命令
格式:
字符名称:
BIT 位地址
该命令把地址赋予标号段要求旳字符名称。
地址,位地址或立即数。
例如:
ORG 8000H
AA: EQU R6
;AA与R6等值
MOV A,AA
;A(R6)
…
03 常用旳伪指令
DATA:数据地址赋值命令
“ DATA<体现式>数据地址赋值命令 格式:
字符名称:
DATA 数据或体现式
此命令把数据地址或代码地址赋予标号段要求旳字符名称。
例如:INDEXJ DATA 8389H
定义了INDEXJ这个字符名称旳地址为8389H,主要用于
汇编语言常用命令、伪指令

DEBUG的主要命令:1.R命令:显示和修改寄存器的值和标志位的状态。
2.D命令:显示指定区域内的内容。
3.G命令:从起点开始执行汇编指令,到终点结束。
4.H命令:计算两个十六进制数的和与差。
5.A命令:输入汇编指令。
6.U命令:反汇编,显示机器码所对应的汇编指令。
7.T命令:跟踪执行从起点执行若干条指令。
常用伪指令的用法:1.符号定义语句:1)等值语句:符号名EQU 表达式2)等号语句:NUM=34……NUM=34+12.变量定义语句:符号名DB/DW/DD 表达式3.段定义语句:1)段定义语句格式:段名SEGMENT 【定位类型】【组合类型】【“类别”】……段名ENDS2)段假设语句:ASSUME 段寄存器名:段名【,…】3)ORG伪指令与地址计数器ORG <表达式>4)PUBLIC和EXTRN伪指令A)PUBLIC伪指令PUBLIU 名字【,…】B)EXTRN伪指令EXTRN 名字:类型【,…】4.过程定义语句过程名PROC NEAR/FAR……RET过程名ENDP5.结束语句汇编语言程序的编辑.汇编.链接.调试步骤1.编辑:打开汇编语言程序入口进入汇编语言子目录c:MASM2.进入DEBUG ,进入调试界面,出入程序3.编译源程序MASM 文件名.ASM4.观察实验结果,如果没有达到设计要求,返回第一步修改命令,继续试验5.连接程序LINK 文件名.OBJ;6.调试程序DEBUG 文件名.EXE。
《汇编语言》学习笔记6——伪指令

《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。
它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。
但程序中没伪指令,则系统就⽆法完成编译。
2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。
⼀般的,段名和段的意义⼀致,便于识别。
2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。
3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。
2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。
在连接时,类别标识相同的段放在连续的存储区中。
(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。
第2章 汇编语言程序中的指令与伪指令

(2) 类型指定运算符 • 格式:THIS 属性或类型 • 功能:该运算符主要用来为相应的变量名或标 号指定类型属性,用来指定下一个能分配的存 储单元的类型。被指定变量或标号的地址属性 (段基址和偏移量)和下一条邻接语句的变量或标 号相同。 (3) 段属性前缀 • 格式:段寄存器(或“段名”,或“段组名”): 地址表达式 • 如 MOV AX,ES:[BX+SI] • (4) 短转移运算符SHORT • 见 转移指令
2.DS和ES的装入
• 在程序中,必须使用MOV指令才能将对应段的段地址 装入寄存器DS和ES中。 • 例如:MOV AX , DATA1 • MOV DS , AX • ……………… • MOV ES , AX • ……………… 3.SS的装入 • 堆栈段是一个特殊的段,一个完整的源程序一般最好定 义堆栈段。除了要生成COM型执行文件的源程序外, 如果在程序中不定义堆栈段,那么,操作系统在装入该 执行程序时将自动为其指定一个64K字节的堆栈段。 • 在程序没有定义堆栈段的情况下,在由连接程序生 成执行文件时,将会产生警告信息,但可以不理会,所 生成的执行文件是可以正常运行的。 • warning xxxx: no stack segment (其中:xxxx是错 误号)
2.1.2
操作数及其表达式
• 1.常量
• (1) 数值常数 • (2) 字符串常量 • (3) 符号常量
2.表达式
• • • • • • • • • • • • • • (1)数值表达式 X +1 ;表达式为变量名“X”的值加1 19 MOD 7 ;19除7的余数是5 AND AX ,075FH ;将(AX)和075FH按位作“与”运 算 (2) “?“表示预留的存储空间。 (3) 地址表达式的运算结果是内存的偏移地址。 第一章讲过的“寻址方式”,都是简单的地址表达式。如 地址表达式 offset data ;表示取变量“data”的偏移量 1)两个地址相加、相乘、相除是无意义 2) 地址加(减)数字量的表达式是有意义的, 3)两个地址相减也是有意义的 而指令MOV AX,(ARRAY_END –ARRAY)/2 则表示把数组长度(即字数)存入寄存器AX中。 (4) 操作数字段可以使用复制定义符DUP。
汇编指令、伪指令大全

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
[工学]第二部分 汇编语言程序设计——伪指令
![[工学]第二部分 汇编语言程序设计——伪指令](https://img.taocdn.com/s3/m/f165327b77232f60ddcca132.png)
data segment ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
类型操作符
类型操作符对名字或标号的类型属
性进行有关设置
类型名 PTR 名字/标号 THIS 类型名 SHORT 标号 TYPE 名字/标号 SIZEOF 变量名 LENGTHOF 变量名
PTR操作符
类型名 PTR 名字/标号
PTR操作符使名字或标号具有指定的类型
类型名可以是
BYTE/WORD/DWORD/FWORD/QWORD/TBYTE 或者是 NEAR/FAR ,还可以是由 STRUCT 、 RECORD 、 UNION以及_var ;w_var是一个字变量 jmp far ptr n_label ;n_label是一个标号
例3.4:属性及其应用-1/5
.model small
.stack .data v_byte equ this byte ;v_byte是字节类型,与变量v_word的地址相同 v_word dw 3332h,3735h ;v_word是字类型的变量 target dw 5 dup(20h) ;分配数据空间2×5=10字节 crlf db 0dh,0ah,'$' flag db 0 n_point dw offset s_label ;取得标号s_label的偏移地址
定义 10 字节伪指令 DT—— 用于为一个或
多个10字节变量分配空间及初始化
10字节变量可以表达扩展精度浮点数
第二部分 汇编语言程序设计——伪指令

例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;利用功能调用返回DOS
code ends
;代码段结束
end start
;汇编结束,同时指明程序起始点
汇编语言程序的开发过程
文本编辑器,如
编 辑
错误
源程序:文件名.asm
汇
汇编程序,如 ML.EXE
编
错误
目标模块:文件名.obj
连
连接程序,如 LINK.EXE
接
错误
可执行文件:文件名.exe
汇编语言源程序
源程序分别用两种格式书写
第一种格式从MASM 5.0开始支持
简化段定义格式
第二种格式MASM 5.0以前就具有
完整段定义格式
Hello, Everybody !
程序功能
;test1.asm(文件名)
.model small ;定义程序的存储模式
.stack
;定义堆栈段
;(注3)
;test2.asm(文件名)
stack segment stack ;定义堆栈段
dw 512 dup(?)
;堆栈段有512字(1024字节)空间
stack ends
;堆栈段结束
data segment
;定义数据段
string db ’Hello, Everybody !’,0dh,0ah,’$’
参数根据指令不同可以没有,可以有1个、2个 或多个
汇编语言程序中,指令参数有数值型,它的主 要形式是常数和数值表达式;
硬指令的操作数有立即数;立即数就要用数值 型参数表达
1、常数
常数(常量)表示一个固定的数值 它又分成多种形式:
(1)十进制常数 (2)十六进制常数 (3)二进制常数 (4)八进制常数 (5)字符串常数 (6)符号常数
算术运算符
+ - * / MOD
逻辑运算符
AND OR XOR NOT
移位运算符
SHL SHR
关系运算符
EQ NE GT LT GE LE
高低分离符
HIGH LOW HIGHWORD LOWWORD
操作符的优先级
1
() <> [] · LENGTH SIZE WIDTH MASK
教学重点
学 习 了 8086 硬 指 令 , 接 着 介绍MASM基本的伪指令。 重点掌握: 程序的格式、开发方法 参数的表达、变量的定义 变量和标号的属性
硬指令和伪指令
硬指令——使CPU产生动作、并在程序执行时 才处理的语句,就是我们刚刚学习的处理器指 令
伪指令(Directive)——不产生CPU动作、在 程序执行前由汇编程序处理的说明性语句,例
array dw maxint dup(0) data ends
字变量和字常量的定义:
WNUM EQU 5678H
;定义WNUM为常量
COUNT DW 20H
;定义COUNT变量,假设在数据段的偏移地址为10H
DELAY: NOP
;空操作指令,没有操作数,带有标号
LOOP DELAY
;循环指令,标号DELAY说明转移位置
BUFFER DB 1,2,3,4,5,6,7
;数据定义伪指令,在主存中开辟7个连续的字 节单元,初值依次为1~7,BUFFER表示首地址
标号、名字与标识符
标号是反映硬指令位置(逻辑地址)的标识符,后跟 一个冒号分隔
DEBUG test1.exe
2.3.1 参数、变量和标号
详细讨论汇编语言程序语句主要部分 参数 变量名 标号
并引出相关的伪指令和操作符 本节重点掌握:
常数的表达、 变量定义伪指令DB/DW/DD、 地址操作符和类型操作符
一、数值型参数
在源程序语句格式的4个组成部分中,参数是 指令的操作对象(在学习硬指令时被称为操作 数),参数之间用逗号分隔
初值表中每个数据一定是字节量(Byte),存 放一个8位数据:
可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X
Y data
segment
;数据段
db 'a',-5
db 2 dup(100),?
db 'ABC'
ends
定义字单元伪指令DW
DW伪指令用于分配一个或多个字单元, 并可以将它们初始化为指定值
.exit 0
;程序结束点,返回DOS
end
;汇编结束
;SampleA.ASM .model small
简化段定义格式 MASM 6.x支持
.stack
.data
...
;在数据段定义数据
.code
.startup ;(注1)
...
;在代码段填入指令序列
.exit 0 ;(注2)
...
;子程序代码
end
.data
;定义数据段
string db ’Hello, Everybody !’,0dh,0ah,’$’
;在数据段定义要显示的字符串
.code
;定义代码段
.startup
;程序起始点,建立DS、SS
mov dx,offset string ;指定字符串
mov ah,9
int 21h
;利用功能调用显示信息
开发过程2:源程序的汇编
汇编是将源程序翻译成由机器代码组成的目标 模块文件的过程
MASM 6.x提供的汇编程序是ML.EXE:
ML /c test1.asm
如果源程序中没有语法错误,MASM将自动生 成一个目标模块文件(TEST1.obj);否则MASM 将给出相应的错误信息
这时应根据错误信息,重新编辑修改源程序后, 再进行汇编
2、数值表达式
数值表达式一般是指由运算符连接的各种常数 所构成的表达式
汇编程序在汇编过程中计算表达式,最终得到 一个数值
程序运行之前,就已经计算出了表达式;所以, 程序运行速度没有变慢,但增强程序的可读性
MASM对除伪指令外各种汇编时处理的指令统 称为操作符(Operator)
运算符
名字是反映伪指令位置(逻辑地址)和属性的标识符, 后跟空格或制表符分隔,没有一个冒号
标识符(Identifier)一般最多由31个字母、数字及规 定的特殊符号(如 _、$、?、@)组成,不能以数字 开头。默认情况下,汇编程序不区别标识符中的字母 大小写
一个程序中,每个标识符的定义是唯一的,还不能是 汇编语言采用的保留字
列表文件是一种文本文件,含有源程序和目标代码, 对我们学习汇编语言程序设计和发现错误很有用。采用/Sg 选项,将在列表文件中得到有些伪指令相应的硬指令
开发过程4:可执行程序的调试
经汇编、连接生成的可执行程序在操作系统下 只要输入文件名就可以运行:
test1
操作系统装载该文件进入主存,并开始运行 如果出现运行错误,可以从源程序开始排错, 也可以利用调试程序帮助发现错误 采用DEBUG.EXE调试程序:
初值表中每个数据一定是字量(Word), 一个字单元可用于存放任何16位数据:
一个段地址 一个偏移地址 两个字符 0~65535之间的无符号数 -32768~+32767之间的带符号数
data segment
;数据段
count dw 8000h,?,'AB'
maxint equ 64h
number dw maxint
本课如程,采数据用说微明软、宏变汇量编定程义等序等MASM 6.11
伪指令与具体的处理器类型无关,但与汇编程 序的版本有关
汇编语言程序的开发
本节从汇编语言程序的语句格式出发, 给出第一个示范性的汇编语言源程序, 并演示汇编语言程序的过程: 编辑 汇编 连接 调试
即汇编语言程序的开发方法
完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、
附加段或堆栈段,段与段之间的顺序可随意排列 需独立运行的程序必须包含一个代码段,并指示程序
执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明
性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段
汇编和连接的依次自动实现
ML汇编程序可自动调用LINK连接程序,实现汇 编和连接的依次进行
ML test1.asm
汇编程序ML.EXE可带其他参数,常用
ML /Fl /Sg test1.asm
该命令除产生模块文件test1.obj和可执行文件 test1.exe外,还将生成列表文件test1.lst
汇编程序在翻译源程序时将跳过该部分, 不对它们做任何处理
分隔符
语句的4个组成部分要用分隔符分开 标号后用冒号,注释前用分号 操作数之间和参数之间使用逗号分隔 其他部分通常采用空格或制表符 多个空格和制表符的作用与一个相同 MASM支持续行符 “\”
汇编语言源程序的组成原则
变量名可以没有。这种情况,汇编程序将直接 为初值表分配空间,无符号地址
设置变量名是为了方便存取它指示的存储单元
初值表
初值表是用逗号分隔的参数 主要由数值常数、表达式或?、DUP组
成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
语句格式
⑴ 执行性语句——由硬指令构成的语句,它通常 对应一条机器指令,出现在程序的代码段中:
标号: 硬指令助记符 操作数,操作数 ;注释
⑵ 说明性语句——由伪指令构成的语句,它通 常指示汇编程序如何汇编源程序:
名字 伪指令助记符 参数,参数,… ;注释
MOV CX,0
;传送指令,具有2个code’ ;定义代码段