⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 指令.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
SAL    OPR , CNT         //Byte/Word

SAL指令与SHL指令完全相同


SAR(Shift Arithmetic Right) 算术右移指令

SAR    OPR , CNT        //Byte/Word

SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.


循环移位指令

ROL ( ROtate Left) 循环左移指令

ROL    OPR , CNT        //Byte/Word

每次移位时,最高位移出并同时移到CF和最低位D0.

ROR (ROtate Right)循环右移指令

ROR    OPR,CNT    //Byte/Word

每次移位时,最低位D0移出并同时移到CF和最高位.

带进位循环移位指令

RCL (Rotate Left through Carry)带进位循环左移指令

RCL    OPR,CNT     //Byte/Word

RCR (Rotate Right through Carry)带进位循环左移指令

RCR    OPR ,CNT       //Byte/Word
JMP ( JuMP ) 无条件转移指令

名称 
 格式 
 执行操作 
 
段内直接短跳转 JMP    SHORT OPR IP=IP+8位偏移量 
段内直接近转移 JMP    NEAR PTR OPR IP=IP+16位偏移量 
段内间接转移 JMP    WORD PTR OPR IP=(EA) 
段间直接转移 JMP    FAR PTR OPR IP=OPR偏移地址,CS=OPR段地址 
段间间接转移 JMP    DWORD PTR OPR IP=(EA),CS=(EA+2) 

1.无条件转移到指定的地址去执行从该地址开始的指令.

2.段内转移是指在同一代码段的范围内进行转移,只需改变IP寄存器内容.

3.段间转移则要转移到另一个代码段执行程序,此时要改变IP寄存器和CS段寄存器的内容.

条件转移指令:根据上一条指令所设置的条件码(标志位)来判断测试条件.

根据五个标志位:ZF、SF、OF、 PF、 CF的两种状态(0 FALSE或1 TRUE)产生10种测试条件.

Name Flag Flag == TRUE [1] Flag ==FALSE [ 0] 
Zero Falg ZF JZ    OPR  //结果为零转移 JNZ    OPR  //结果不为零转移 
Sign Falg SF JS    OPR  //结果为负转移 JNS    OPR  //结果为正转移 
Overflow Flag OF JO   OPR  //溢出转移 JNO   OPR  //不溢出转移 
Parity Flag PF JP    OPR  //结果为偶转移 JNP    OPR  //结果为奇转移 
Carry Flag CF JC    OPR  //有进位转移 JNC    OPR  //无进位转移 


两个数比较:

情况 无符号数 有符号数 
指令 满足条件 指令 满足条件 
A < B JC CF==1 JL SF^OF==1 && ZF==0 
A ≥ B JNC CF==0 JNL SF^OF==0  ||  ZF==1 
A ≤ B JNA CF==1 || ZF==1 JLG SF^OF==1  ||  ZF==1 
A > B JA CF==0 && ZF==0 JG SF^OF==0 && ZF==0 

 
测试CX转移指令

JCXZ    OPR          //CX==0时转移


LOOP(LOOP)循环指令

LOOP           OPR 测试条件:CX ≠ 0               //OPR在程序中实际是个标号 
LOOPZ        OPR 测试条件:ZF == 1 && CX ≠ 0 
LOOPNZ     OPR 测试条件:ZF == 0 && CX ≠ 0 

执行操作: 先执行CX=CX-1,再检测上面的测试条件,如满足则IP=IP+符号扩展的D8,不满足则退出循环.


过程调用及返回指令

CALL (CALL) 过程调用指令

CALL    DST            //DST在程序中实际是子程序标号

执行操作:先将过程的返回地址(即CALL的下一条指令的首地址)存入堆栈,然后转移到过程入口地址执行子程序.

调用方式 格式 断点保护入栈情况 过程入口地址 
段内直接 CALL  NEAR  PTR  PR1 (SP-1)(SP-2)←IP , CS不进栈 CS值保持不变,IP←DST 
段内间接 CALL  WORD PTR  (EA) (SP-1)(SP-2)←IP , CS不进栈 CS值保持不变,IP←(EA) 
段间直接 CALL  FAR  PTR  PR1 (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←DST偏移地址,CS←DST段地址 
段间间接 CALL  DWORD PTR  (EA) (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←(EA),CS←(EA+2) 

注:为了表明是段内调用,可使用NEAR PTR属性操作符作说明.

RET(RETurn)子程序返回指令

RET    

RET    EXP        //带立即数返回

子程序返回指令RET放在子程序末尾,它使子程序在执行完全部任务后返回主程序继续执行被打断后的程序.返回地址在子程序调用时入栈保存的断点地址-IP或IP和CS.
CLC (CLear Carry) 进位位置0指令

CLC        //执行操作后,CF=0

CMC (CoMplement Carry) 进位位求反指令

CMC    //执行操作后,CF=!CF

STC (SeT Carry) 进位位置1指令

STC    //执行操作后,CF=1

NOP (No Operetion) 无操作指令

NOP    //此指令不执行任何操作,其机器码占一个字节单元

HLT (HaLT) 停机指令

HLT

执行操作后,使机器暂停工作,使处理器CPU处于停机状态,以等待一次外部中断到来,中断结束后,程序继续执行,CPU继续工作.
 同一个程序中,标号或变量只能定义一次.

标号有三种属性:段、偏移、类型(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成对使用,把汇编语句分成段

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

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

可选项说明:详细信息  
定位类型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 ]
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -