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

📄 指令.txt

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

  标志寄存器又称程序状态寄存器PSW (Program Status Word).

各机型标志寄存器的内容如下:
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. 
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1. 
ZF zero flag 零标志 运算结果等于0时为1,否则为0. 
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0. 
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. 
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0. 
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. 
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. 
TF trap flag 陷阱标志 用于调试单步操作. 
IOPL I/O privilege level I/O特权级 在保护模式下,用于控制对I/O地址空间的访问. 
NT nested task 嵌套任务标志   
RF resume flag 重新启动标志   
VM virtual_8086 mode 虚8086模式位 VM=1时,可模拟8086处理器的程序设计环境. 
AC alignment check mode 对准检查方式位   
VIF virtual interrupt flag 虚拟中断标志   
VIP virtual interrupt pending flag 虚拟中断未决标志   
ID identification flag 标识标志
DEBUG中标志位的符号表示:
FLAG NAME FLAG == TRUE (1) FLAG == FALSE (0) 
OF 溢出(是/否) OV OVerflow NV Not oVerflow 
DF 方向(减量/增量) DN DowN UP UP 
IF 中断(允许/关闭) EI Enable Interrupt DI Disable Interrupt 
SF 符号(负/正) NG NeGative PL PLus 
ZF 零(是/否) ZR ZeRo NZ Not  Zero 
AF 辅助进位(是/否) AC Auxiliary Carry NA Not Auxiliary 
PF 奇偶(是/否) PE Parity Even PO Parity Odd 
CF 进位(是/否) CY CarrY NC Not Carry 
 
  过程设计 
--------------------------------------------------------------------------------
  过程定义语句:PROC 和ENDP必须有名字,两者成对出现.

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

...

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

procedure_name    ENDP

注:主程序和所调用的过程在同一代码段中,则定义说明为NEAR属性

    主程序和所调用的过程不在同一代码段中,则定义说明为FAR属性

 

过程文档说明:

1.过程名

2.功能说明

3.占用寄存器、工作单元说明

4.输入参数说明

5.输出参数说明

 

现场保护及现场恢复的两种方法:

1.利用PUSH指令将过程要占用的寄存器的内容保存在堆栈中,恢复时用POP指令从栈中取出.

如果在主程序用PUSH指令保护寄存器,则要在主程序中用POP指令恢复寄存器.

如果在过程中用PUSH指令保护寄存器,则要在过程中用POP指令恢复寄存器.

SUB1    PROC    NEAR   ;本例在过程中使用PUSH和POP

        PUSH    AX        ;入栈保护 [into stack to protect]

        PUSH    BX

        PUSH    DX

        ...

        POP    DX        ;出栈恢复 [out  stack  to restore]

        POP    BX

        POP    AX

        RET

SUB1    ENDP

2.利用数据传送指令将过程要占用的寄存器的内容保存到指定的内存单元,恢复时再取回到相应的寄存器中.

BUFFER    DW    10    DUP(?)        ;指定的内存单元 [specified  memory block]

...

SUB1    PROC    NEAR

        MOV    DI , OFFSET BUFFER  ;将寄存器存入到内存单元保护 [save memory block to protecte register]

        MOV    [DI] , AX

        MOV    [DI+2] , BX

        MOV    [DI+4] , DX

        ...

        MOV    SI , OFFSET  BUFFER  ;从内存单元取回到相应的寄存器[restored register from memory block]

        MOV    AX , [SI]

        MOV    BX , [SI+2]

        MOV    DX , [SI+4]

        RET

SUB1    ENDP

 

主程序和过程间参数传递的三种方法:寄存器传递、堆栈传递、存储器传递

调用过程前,必须把操作中的加工处理数据传送给过程,这些加工处理数据称为输入参数.

返回主程序前,把本次操作的最终结果传递给主程序,这些加工处理所得的结果称为输出参数.
 
  寻址 
--------------------------------------------------------------------------------
  当操作数存放在存储器时,存储单元的物理地址有两部分:段地址和偏移地址.

指令中操作数也可以不在基本规定的段区内,必须在指令中指定段寄存器,即段超越.

存取的约定段及段超越(可修改段),如下所示 :

 存取方式 默认段 偏移地址 段超越  
 取指令 CS IP - - - -  
 堆栈操作 SS SP - - - -  
 源串 DS SI CS,ES,SS  
 目的串 ES DI - - - -  
 BP SS (EA) CS,DS,ES  
 一般数据 DS (EA) CS,ES,SS  

注:EA=Effect Address即有效地址,   - - - -表示不可以段超越

 

 

基址寄存器: BX , BP

变址寄存器: SI  ,  DI

除基址BX , BP和变址SI , DI这四个寄存器可间接寻址外(即加上中括号[ ]),其它寄存器一律不准间接寻址.

与数据有关的寻址方式:

立即寻址 MOV  AX , 常数 
直接寻址   MOV  AX , [常数] ;加上中括号  或  MOV AX , 变量名或标号 
寄存器寻址 MOV  AX , 通用寄存器 
寄存器间接寻址 MOV  AX , [(BX,BP,SI,DI)中的一个]    ;以下四行均需加上中括号 
寄存器相对寻址 MOV  AX , [(BX,BP,SI,DI)中的一个 + 偏移量] 
基址变址寻址 MOV  AX , [基址寄存器 + 变址寄存器] 
相对基址变址寻址 MOV  AX , [基址寄存器 + 变址寄存器 + 偏移量] 

与转移地址有关的寻址方式(CALL指令也可用下列四种中任何一种寻址):

寻址方式 格式 转移的有效地址 
段内直接寻址 JMP SHORT 标号 IP=标号, CS值不变  
段内间接寻址 JMP WORD PTR 标号[基/变址寄存器]  IP=(EA), CS值不变 
段间直接寻址 MP FAR PTR 标号 IP=标号的偏移地址,CS=标号的段对址 
段间间接寻址 JMP DWORD PTR 标号[基/变址寄存器] IP=(EA) , CS=(EA-2) 
  
  数据传送指令 
 
MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.

MOV  DST , SRC    //  Byte / Word

执行操作: dst = src
  
 
1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).

2.立即数不能直接送段寄存器

3.不允许在两个存储单元直接传送数据

4.不允许在两个段寄存器间直接传送信息
 
PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.

PUSH   SRC    //Word

入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.

入栈时高位字节先入栈,低位字节后入栈.
 
POP     DST    //Word

出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.

执行POP   SS指令后,堆栈区在存储区的位置要改变.

执行POP  SP 指令后,栈顶的位置要改变.


XCHG(eXCHanG)交换指令: 将两操作数值交换.

XCHG   OPR1, OPR2     //Byte/Word

执行操作: Tmp=OPR1       OPR1=OPR2        OPR2=Tmp

1.必须有一个操作数是在寄存器中

2.不能与段寄存器交换数据

3.存储器与存储器之间不能交换数据.

 
XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.

XLAT   (OPR 可选)   //Byte

执行操作: AL=(BX+AL)

指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.

 
地址传送指令: LEA,LDS和LES

LEA(Load Effective Address) 有效地址传送寄存器指令

LEA     REG , SRC              //指令把源操作数SRC的有效地址送到指定的寄存器中.

执行操作: REG  = EAsrc 

注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器

MOV     BX , OFFSET OPER_ONE 等价于 LEA     BX , OPER_ONE

MOV  SP , [BX]  //将BX间接寻址的相继的二个存储单元的内容送入SP中

LEA   SP , [BX]  //将BX的内容作为存储器有效地址送入SP中

 
LDS(Load DS with pointer)指针送寄存器和DS指令

LDS    REG ,  SRC   //常指定SI寄存器。

执行操作: REG=(SRC), DS=(SRC+2)        //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

 
LES (Load ES with pointer) 指针送寄存器和ES指令

LES    REG , SRC        //常指定DI寄存器

执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已.

 
标志寄存器传送指令: LAHF,SAHF,PUSHF和POPF

LAHF ( Load AH with Flags ) 标志位送AH指令

LAHF              //将PSW寄存器中的低8位的状态标志(条件码)送入AH的相应位, SF送D7位, ZF送D6位......

执行操作: AH=PSW的低位字节。

SAHF ( Store AH into Flags ) AH送标志寄存器指令

SAHF               //将AH寄存器的相应位送到PSW寄存器的低8位的相应位, AH的D7位送SF, D6位送ZF......

执行操作: PSW的低位字节=AH。

PUSHF ( PUSH the Flags) 标志进栈指令

PUSHF         //将标志寄存器的值压入堆栈顶部, 同时栈指针SP值减2

执行操作: SP=SP-1,(SP)=PSW的高8位,  SP=SP-1, (SP)=PSW的低8位
 
POPF ( POP the Flags ) 标志出栈指令

POPF            //与PUSHF相反, 从堆栈的顶部弹出两个字节送到PSW寄存器中, 同时堆栈指针值加2

执行操作:  PSW低8位=(SP), SP=SP+1,   PSW高8位=(SP) , SP=SP+1

输入输出指令(IN,OUT):只限于使用累加器AX或AL与外部设备的端口传送信息.

IN (INput)输入指令:信息从I/O通过累加器传送到CPU

IN    AL , PORT         //直接的字节输入,PORT是外设端口编号(即端口地址),只能取 00H ~ 0FFH共256个端口地址.

IN    AX , PORT        //直接的字输入,AX存储连续两个端口地址PORT+1,PORT

IN    AL , DX             //间接的字节输入,端口地址范围可通过DX设置为0000H ~ 0FFFFH共65536个端口地址

IN    AX , DX             //间接的字输入

OUT( OUTput)输出指令 :信息从CPU通过累加器传送到I/O

OUT    PORT , AL        //直接的字节输出,PORT规定与IN指令相同.

OUT    PORT , AX

OUT    DX , AL            //间接的字节输出

OUT    DX , AX

MOV   AL,05H     OUT  27H, AL    //将字节05H传送到地址27H的端口
加法运算指令

ADD(ADD)加法指令

ADD     DST , SRC      //Byte/Word

执行操作: dst=dst+src

1.两个存储器操作数不能通过ADD指令直接相加, 即DST 和SRC必须有一个是通用寄存器操作数.

2.段寄存器不能作为SRC 和DST.

3.影响标志位Auxiliary Crray Flag ,Carry Flag, Overflow Flag, Parity Flag, Sign Flag 和Zero Flag ,如下所示:

CF 根据最高有效位是否有进(借)位设置的:有进(借)位时CF=1, 无进(借)位时CF=0. 
OF 根据操作数的符号及其变化来设置的:若两个操作数的符号相同,而结果的符号与之相反时OF=1, 否则为0. 
ZF 根据结果来设置:不等于0时ZF=0, 等于0时ZF=1 
SF 根据结果的最高位来设置:最高位为0, 则SF=0. 
AF 根据相加时D3是否向D4进(借)位来设置:有进(借)位时AF=1, 无进(借)位时AF=0 
PF 根据结果的1的个数时否为奇数来设置:1的个数为奇数时PF=0, 为偶数时PF=1 

ADC( ADd with Carry)带进位加法指令

ADC     DST , SRC  //Byte/Word

执行操作: dst=dst+src+CF  //与ADD不同之处是还要加上进位标志位的值.

INC ( INCreament) 加1指令

INC    OPR    //Byte/Word

执行操作: OPR=OPR+1

1.OPR可以是寄存器和存储器操作数, 但不能是立即数和段寄存器

2.影响标志位OF,SF,ZF,PF 和AF,不影响CF.

减法运算指令

SUB ( SUBtract ) 不带借位的减法指令

SUB    DST , SRC    //Byte/Word

执行操作:dst=dst - src

1.DST和SRC寻址方式及规定与ADD相同.

2.影响全部标志位.(判断标志位参见ADD)

SBB ( SuBtract with  Borrow) 带借位减法指令

SBB    DST , SRC        //Byte/Word

执行操作:dst= dst - src - CF


DEC ( DECrement ) 减1指令

DEC    OPR    //Byte/Word

执行操作:OPR = OPR - 1  //除CF标志位, 其余标志位都受影响.

⌨️ 快捷键说明

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