8086汇编伪指令小结

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

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

   

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

1. TYPE    expression_r(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

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

fees  DW 100 DUP(?)          

MOV  CX, LEGNTH  fees  等价于MOV  CX, 100

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

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

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

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

5. 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

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

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

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

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

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

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

first_type    EQU    THIS  BYTE

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

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

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

CONST    EQU    0ABCDH  ,      MOV    AH, HIGH 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成对使用,把汇编语句分成段

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

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

可选项说明:详细信息 

定位类型align_type:说明段的起始地址就有怎有怎样的边界值.

        PARA    缺省项.  指定段的起始地址须从小段边界开始,即以16进表示地址时最低位必须为0.

        BYTE     可从任何地址开始.

        WORD    必须从字的边界开始,即段地址必须是偶数..

        DWORD  必须从双字的边界开始,即以16进制表示地址时最低位必须是4的倍数.

        PAGE     必须从页的边界开始,即以16时制表示地址时最低两位必须为00.(能被256整除)

组合类型combine_type:说明程序连接的段合并方法.

        PRIVATE    缺省项.为私有段,连接时不与其他模块中的同名分段合并.

        PUBLIC       将与相同名字的其它分段合并.

        COMMON  将与相同名字的其它分段合并且会产生覆盖.

        MEMORY   同PUBLIC.

        STACK        指定该段在运行时为堆栈的一部分.

使用类型use_type:只适用386及其后继机型,用来说明是USE16(16位寻址)还是USE32(32位寻址).

类别class:用引号中给出连接时组成段组的类型名.

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 ]

   

来自 <http://blog.sina.com.cn/s/blog_4a92ce12010006m2.html>

posted on 2015-05-05 20:13  专注于爬电线杆20年  阅读(5897)  评论(0编辑  收藏  举报

导航