8086伪指令[收集]

同一个程序中,标号或变量只能定义一次.

标号有三种属性:段、偏移、类型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)

数值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG

TYPE    expression(or label)

如果表达式是变量,则回送该变量以字节数表示的类型:DB为 1, DW为 2, DD为 4…

如果表达式是标号,则回送该标号类型的数值:NEAR为 -1, FAR为 -2.

如果表达式是常量,则回送0.

array DW A110H,B02CH,C322H            ADD    AX, TYPE  array 等价于 ADD    AX, 2

LENGTH    variable 对于变量使用DUP的情况,将回送分配给该变量的单元数; 对其它情况则回送1.

fees DW 100 DUP(?)            MOV  CX, LEGNTH  fees 等价于MOV  CX, 100

SIZE    variable 回送分配给该变量的字节数

MOV    CX, SIZE  fees 等价于 MOV CX, 200

OFFSET    variable (or lable) 回送变量或标号的偏移地址.

MOV    BX,OFFSET OPER_ONE 等价于 LEA BX,OPER_ONE 语句 ,将OPER_ONE的偏移地址送入BX

SEG    variable(or lable) 回送变量或标号的段地址.

若OPER_ONE是DATA_SEG数据段中的一个变量,下面语句取得DATA_SEG段首地址

MOV    DS , SEG OPER_ONE 等价于 MOV    AX , DATA_SEG            MOV    DS , AX

属性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD

type    PTR    expression 用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型.

表示按expression表达式寻址,按指定的类型type看待.

即PTR是给后面的expression操作数赋予新的数据类型或地址类型.

MOV    BYTE PTR[BX] , 5        //存入字节(Byte)单元

MOV    WORD PTR[BX] , 5    //存入字(Word)单元

THIS    type 指定与当前地址计数器相等的一个地址单元的类型.type是NEAR、FAR、PROC,也可以是BYPE、WORD…

first_type    EQU    THIS  BYTE

word_table    DW    100 DUP(?)    此时,first_type的偏移地址与word_table完全相同,但它是字节类型

HIGH (LOW)    express 字节分离操作符, HIGH取高位字节, LOW取低位字节.

HIGHWORD (LOWWORD)    express 字分离操作符, HIGHWORD取高位字, LOWWORD取低位字.

CONST    EQU    0ABCDH        MOV    AH, HIGHT CONST 等价于MOV    AH,0ABH

数据定义语句

variable_name Mnemonic     oper1, oper2…..

常用的助记符Mnemonic有:

DB 定义字节,表示其后每个操作数占有一个字节(1Byte)单元
DW 定义字,表示表示其后每个操作数占有一个字(2Byte)单元
DD 定义双字,表示表示其后每个操作数占有两个字(4Byte)单元
DQ 定义四个字,表示表示其后每个操作数占有四个字(8Byte)单元
DT 定义十个字节,表示表示其后每个操作数占有十个字(10Byte)单元,形成压缩BCD码.

data_byte     DB      10 , 4 , 10H , ?        //共定义了4个字节,其中 ‘?’ 是保留单元

data_word    DW    100,?,100H            //共定义了3个字(6Byte)

str_aa            DB     ‘ABCDEFG’            //定义和初始化多于两个能上能下字符的字符串时,只能使用DB伪指令.

符号定义语句(即常量)

name EQU    expression //定义

PURGE    name1,name2 //解除

CONSTANT     EQU    256       //表示CONSTANT的值为256

段定义语句:SEGMENT … ENDS、ASSUME、ORG

segmnet_name SEGMENT    [align_type] [combine_type] [use_type] [class]

segment_name ENDS //SEGMENT和ENDS成对使用,把汇编语句分成段

对于数据段、附加段和堆栈段,一般是存储单元定义、初始化数据、分配单元等伪指令.

对于代码段,主要是指令序列和伪指令.

可选项说明:详细信息

ASSUME使汇编程序在汇编指令时,能知道各段寄存器的值.

ASSUEM    segment_registername : segment_name , segment_registername : segment_name

任何对存存储器或堆栈的访问的指令,都将使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.

ASSUME只指定某个段分配给某个寄存器,并不能把段地址装入段寄存器.

所以,DS、ES、SS段寄存器的值必须通过MOV指令来赋予,CS段寄存器在程序初始化时自动完成.

为了给存储单元设置起始偏移地址,可以用ORG伪指令.

ORG    表达式 //表达式的值范围必须在0 ~ +65535

伪指令ORG可设置于代码段、数据段的任何地方.

mydata    SEGMENT            //段定义,段名为mydata

ORG     100H                     //置mydata段的起始偏移地址为100H

X    DB    12H , ? , 30H     //数据定义,X 的偏移地址为0100H, X+1=0101H, X+2=0102H

Z    DD    9C56H               //Z的偏移地址为0103H

mydata    ENDS

mycode    SEGMENT

ASSUME    CS : mycode ,  DS : mydata    //用ASSUME伪指令分配段寄存器

start: MOV AX , mydata  //等价于MOV AX , SEG X语句, 将mydata段的起始地址装入到DS

MOV DS , AX

mycode    ENDS

END     start      //源程序结束指令END, 其中start为lable

过程定义语句:PROC… ENDP

procedure_name PROC    [ NEAR | FAR ] //要说明是NEAR过程或FAR过程.

RET //RET 返回指令必须与[ NEAR  |  FAR ] 对应

procedure_name ENDP        //PROC 和ENDP必须有名字,两者成对出现.

宏指令语句:MACRO…ENDM

macro_name MACRO    parameter_list ] //形参 parameter_list 可选,有多个参数时,中间用逗号隔开.

ENDM

MULTIPLY    MACRO    OPR1 , OPR2 , RESULT    //宏定义,宏名MULTIPLY,形参为OPR1,OPR2和RESULT

PUSH    DX

PUSH    AX

MOV    AX , OPR1

IMUL    OPR2

MOV    RESULT , AX

POP    AX

POP    DX

ENDM

MULTIPLY    240 , BX , SAVE    //宏调用,实参为240 , BX , SAVE

宏指令与子程序的区别:

子程序产生目标代码少,占用内存少,但执行时间长,速度慢.

宏指令产生目标代码长,占用内存多,但执行时间短,速度快.

程序开始和结束语句:NAME | TITLE、END

模块名:NAME    moudle_name

标题名:TITLE    text

源程序结束指令:END    [ lable ]

By:http://blog.21ic.com/user1/6961/archives/2010/74725.html

《8086伪指令[收集]》有2个想法

  1. 话说微机原理还真不知道当时怎么考过的……到现在还稀里糊涂的。。。呵呵

发表评论

邮箱地址不会被公开。 必填项已用*标注