乐乐的笔记 https://bbs.21ic.com/?590655 [收藏] [复制] [RSS] 点滴记录个人工作进程!

日志

8086伪指令

已有 1332 次阅读2010-10-17 13:01 |个人分类:MCU|系统分类:单片机| 80x86, 伪指令

三、伪指令


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


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


 



数值回送操作符TYPELEGNTHSIZEOFFSETSEG


TYPE    expression(or label)


如果表达式是变量,则回送该变量以字节数表示的类型:DB1, DW2, DD4...


如果表达式是标号,则回送该标号类型的数值: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_ONEDATA_SEG数据段中的一个变量,下面语句取得DATA_SEG段首地址


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


 


 


属性操作符PTRTHISHIGHLOWHIGHWORDLOWWORD


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


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


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


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


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


 


THIS    type    指定与当前地址计数器相等的一个地址单元的类型.typeNEARFARPROC,也可以是BYPEWORD...


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


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


...


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


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


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







可选项说明:详细信息

 


  


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


ASSUEM    segment_registername : segment_name , segment_registername : segment_name...


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


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


所以,DSESSS段寄存器的值必须通过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, 其中startlable


 


 


过程定义语句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,OPR2RESULT


        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 | TITLEEND


模块名:NAME    moudle_name


标题名:TITLE    text


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


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)