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

📄 指令.txt

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

NEG ( NEGate ) 求补指令

NEG    OPR

执行操作:opr = 0- opr //将操作数按位求反后末位加1.

CMP ( CoMPare ) 比较指令

CMP    OPR1 , OPR2 

执行操作:OPR1 - OPR2  //与SUB指令一样执行运算, 但不保存结果.

比较情况 无符号数 有符号数 
A=B ZF=1 ZF=1 
A>B CF=0 && ZF=0 SF^OF=0 && ZF=0 
A<B CF=1 && ZF=0 SF^OF=1 && ZF=0 
A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1 
A<=B CF=1 || ZF=1 SF^OF=1 || ZF=1 


乘法运算指令

MUL ( unsigned  MULtiple ) 无符号数乘法指令

MUL    SRC   //Byte/Word    .

执行操作:Byte  =>   AX= AL *src    //字节运算时目的操作数用AL, 乘积放在AX中

         Word =>   DX=AX *src    //字运算时目的操作数用AX, DX存放乘积的高位字, AX放乘积的低位字

1.目的数必须是累加器 AX 或AL,指令中不需写出

2. 源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数, 而绝对不允许是立即数或段寄存器.

 

IMUL (sIgned  MULtiple) 有符号数乘法指令

IMUL    SRC    //与MUL指令相同,但必须是带符号数


除法运算指令

DIV ( unsigned DIVide) 无符号数除法指令

DIV     SRC        //Byte/Word    其中: SRC的规定同乘法指令MUL

执行操作:Byte => AX / src     //字节运算时目的操作数在AX中,结果的商在AL中 ,余数中AH中

         Word=> DX,AX /src //字运算时目的操作数在DX高位字和AX低位字中,结果的商在AX中 ,余数在DX中

存储器操作数必须指明数据类型:BYTE PTR src 或 WORD PTR src


IDIV (sIgned DIVied) 有符号数除法指令

IDIV     SRC        //Byte/Word        与DIV指令相同,但必须是带符号数

 


转换指令

CBW (Convert Byte to Word) 字节转换为字指令

CBW

执行操作: AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,则AH=00H,若AL中的D7=1,则AH=FFH.


CWD (Convert Word  to Double word) 字转换为双字指令

CWD

执行操作: AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0,则DX=0000H,若AX中的D15=1,则DX=FFFFH.


十进制调整指令

当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出.

在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD ( Binary Coded Decimal ).

BCD码又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示.

压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串.

非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义.


压缩的BCD码调整指令

DAA (Decimal Adjust for Addition) 加法的十进制调整指令

DAA

执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中.

DAS (Decimal Adjust for Subtraction) 减法的十进制调整指令

DAS

执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中.

非压缩的BCD码调整指令

AAA (ASCII Adjust for Addition) 加法的ASCII调整指令

AAA

执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中.

AAS (ASCII Adjust for Subtraction) 减法的ASCII调整指令

AAS

执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中.
 MOVS ( MOVe String) 串传送指令

MOVB         //字节串传送    DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1

MOVW        //字串传送      DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2

执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.

在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.

MOVS    DST , SRC    //同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数.

1.目的串必须在附加段中,即必须是ES:[DI]

2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].
 
STOS (STOre into String) 存入串指令

STOS    DST

STOSB         //存放字节串   ( DI ) = AL

STOSW        //存放字串     ( DI ) = AX

执行品作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容.

1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值.

2.DI所指向的存储单元只能在附加段中,即必须是ES:[DI]

LODS ( LOaD from String ) 从串取指令

LODS    SRC

LODSB         //从字节串取    AL=(SI)

LODSW        //从字串取      AX= (SI±1) (SI)

执行操作:把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据DF值及数据类型修改SI的内容.

1.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值.

2.源串允许使用段超越前缀来改变数据存储的段区.


REP (REPeat)重复操作前缀

REP    String Primitive //其中:String Primitive可为MOVS,STOS或LODS指令

执行操作:使REP前缀后的串指令重复执行,每执行一次CX=CX-1,直至CX=0时退出REP.


方向标志设置

CLD (CLear Direction flag) 清除方向标志指令

CLD

执行操作:令DF=0, 其后[SI],[DI]执行增量操作

 

STD (SeT Direction flag) 设置方向标志指令

STD

执行操作:令DF=1, 其后[SI],[DI]执行减量操作


CMPS (CoMPare String) 串比较指令

CMPS       SRC ,  DST

CMPSB            //字节串比较   (SI)-(DI)

CMPSW          //字串比较     (SI+1)(SI) - (DI+1)(DI)

执行操作:把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果,只根据结果置标志位.


SCAS (SCAn String ) 串扫描指令

SCAS        DST

SCASB

SCASW

执行操作:把AX或AL的内容与由DI指向的在附加段中的一个字节或字相减,不保留结果,根据结果置标志位.
 
AND, OR , XOR 和 TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同.

NOT是单字节操作指令,不允许使用立即数.

逻辑运算均是按位进行操作,真值表如下:

AND (位与&) OR ( 位或| ) XOR  ( 位异或^ )  
1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0 
 1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0 
 1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0 
  


A:逻辑运算指令

AND (and) 逻辑与指令

AND    DST , SRC           //Byte/Word

执行操作:dst = dst & src

1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位.

2.AND指令典型用法A:用于屏蔽某些位,即使某些位为0.

屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与

MOV AL , 39H     //AL= 0011 1001B[39H]

ADD AL , 0FH    // AL= 0000 1001B[09H]  即0011 1001B[39H]  &  0000 1111B[0FH] = 0000 1001B[09H]

3.AND指令典型用法B:取出某一位的值(见TEST)


OR (or) 逻辑或指令

OR    DST ,  SRC         //Byte/Word

执行操作:dst = dst | src

1.OR指令执行后,将使CF=0, OF=0, AF位无定义,指令执行结果影响SF, ZF和PF标志位.

2.常用于将某些位置1.

将AL的第5位置1:

MOV AL , 4AH    // AL=0100 1010B[4AH]

OR    AL , 10H      // AL=0101 1010B[5AH]   即0100 1010B[4AH]  |  0001 0000B[10H] =0101 1010B [5AH]


XOR (eXclusive OR) 逻辑异或指令

XOR    DST , SRC        //Byte/Word

执行操作:dst = dst ^ src

1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志.

2.XOR指令使某些位维持不变则与 '0' 相异或,若要使某些位取反则与 '1'相异或.

将AL的高4位维持不变,低4位取反:

MOV AL, B8H    //AL=1011 1000B[B8H]

XOR  AL, 0FH    //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]

测试某一个操作数是否与另一确定操作数相等:

XOR    AX , 042EH

JZ       ....   //如果AX==042EH, 则ZF=TRUE(1), 执行JZ...

NOT (not) 逻辑非指令

NOT    OPR                        //Byte/Word

执行操作:opr = ~opr   // ~ 01100101 [65H] =10011010 [9AH]

1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.NOT指令不影响任何标志位。

将AL各位取反:

MOV AL,65H    //AL=0110 0101B[65H]

NOT AL             //AL=1001 1010B[9AH]  即 ~ 0110 0101B[65H]=1001 1010B[9AH]


TEST (test) 指令

TEST    OPR1 , OPR2        //Byte/Word

执行操作:opr1 & opr2

1.两个操作数相与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0, OF=0,而AF位无定义.

2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足.只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假.

检测某位是否为1:

令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则 JNZ...

TEST AL , 0000 00001B   //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令 

JNZ   THER     //最低位若为1, 则ZF=FALSE(0), 执行JNZ THER, 否则执行下一条指令.

或者:先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ...

MOV    DL , AL    //将AL 传送到DL,主要是不要影响AL的值.   以下测试AL的b2位是否为1

NOT    DL     //先对操作数求反

TEST    0000 0100B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JZ    THER        //若AL的b2位为1,则ZF=TRUE(1), 执行JZ    THER


B:移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF.AF无定义.]

非循环逻辑移位:把操作数看成无符数来进行移位.

SHL ( SHift logical Left )逻辑左移指令

SHL    OPR , CNT     //Byte/Word

执行操作:使OPR左移CNT位,并使最低CNT位为全0.

1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.移位次数由CNT决定.每次将OPR的最高位移出并移到CF,最低位补0.

MOV  CL , 7            //若移位多次, 先预置移位次数CL

SHL    DX ,  CL       //CNT可取1或CL寄存器操作数


SHR (SHift logical Right) 逻辑右移指令

SHR    OPR , CNT        //Byte/Word

同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.


非循环算术移位:将操作数看成有符号数来进行移位.

SAL (Shift Arithmetic Left) 算术左移指令

⌨️ 快捷键说明

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