§2 指令系统
目前在微机上常见的汇编语言是MASM(Macro Assembler Language 宏汇编语言),因此我们以8086/8088 MASM为主要介绍内容,也涉及一些MASM 5.0,MASM 6.0等版本内容。
OPR SRC
指令助记符 源操作数
DEST 目的操作数
? 零操作数在指令中隐含指明了操作数所处的地方。 一、 传送类指令
1.数据传送指令(MOVE)
⑴格式:MOV DEST ,SRC (不区分大小写) ⑵功能:
可以进行字节数据传递,也可以进行字数据传送。但SRC和DEST的长度必须一致,不能一个是字节数据,而另一个是字数据。 ⑶举例:
①CPU通用寄存器之间传递
MOV CL,AL;
8bit
MOV SI,AX; 16bit
②通用寄存器与段寄存器之间传递。
MOV DS, AX;
AX中16位→DS
MOV AX, ES; ES→AX
③通用寄存器与存储单元之间
MOV AL,[BX]; DS数据段(BX)所指存储单元内容→AL MOV [DI],AX; AX中16位数据→DS:(DI) (DI)+1 MOV [2000H], CX; CX中16位→DS:(2000H) (2001H)
④段寄存器和存储单元之间
MOV DS,[2000H]; DS:[2000H] [2001H]→DS MOV [BX][SI],CS;
CS→DS:[BX]+(SI) (BX)+(SI)+1
⑤立即数到通用寄存器。
MOV SP,2000H; 2000H→SP
⑥立即数到存储单元。
MOV WORD PTR[SI], 4501H; 4501H→DS:(SI) (SI)+1 *PTR汇编操作符与WORD一起表示字操作,因为4501H类型不确定。BYTE PTR限定字节。 ⑷说明:
MOV指令数据传送方向如下图所示:
立即数 存储器 CS 段寄存器DS ES SS 通用寄存器 AX BX CX DX BP SP SI DI ①除源操作数SRC是立即数的情况外,MOV指令中DST和SRC必须要用到一个寄存器,不允许用MOV在两个存储单元之间传送数据。若需要时,可借助一通用寄存器为桥梁,即:
MOV AL,[SI] MOV [DI],AL
②不能用CS和IP作目的操作数,即这两个数的内容不能随便改变。 ③不允许在段寄存器之间直接传送数据。 ④不允许用立即数作目的操作数。
⑤不能向段寄存器送立即数,因此,对段寄存器初始化赋值时,要通过通用寄存器。
MOV AX,DATA MOV DS,AX
2.交换指令(Exchange) ⑴格式:
XCHG DST,SRC ⑵功能:
源操作数和目的操作数两者的内容相互交换。
⑶举例;
XCHG BX,[BP] [SI]
设指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,
SRC物理地址=2F000+0200+0046=2F246 则:
(BX)=4154,(2F246H)=6F30H
⑷说明:
①两个操作数必须有一个在寄存器中。即可以在寄存器之间或寄存器与存储器之间交换信息。
②不允许使用段寄存器。
③允许字或字节操作,且不影响标志位。 3.堆栈操作指令(PUSH/POP)
堆栈是以“后进先出”的原则暂存一批需要保护的数据或地址的一个特定存储区。
堆栈段段地址由SS提供,偏移地址由SP提供,SP始终指向栈顶。堆栈操作有压栈(PUSH)和出栈(POP)两种,均以字为单位。
? 压栈过程:例PUSH AX ① SP←SP-1 ② (SP)←AH ③ SP←SP-1 ④ (SP)←AL
? 出栈过程:例POP BX ① BL←(SP) ② SP←SP+1 ③ BH←(SP) ④ SP←SP+1 4.标志位传送指令。
对标志位寄存器进行操作有4条指令,都是零操作数。 ⑴取标志寄存器指令(Load register AH from Flag) 格式:LAHF
功能:把标志寄存器的低8位传送给AH寄存器,即把SF,ZF,AF,PF
和CF标志位分别送至AH的第7、6、4、2、0位,AH的第5、3、1位是任意的,指令对标志寄存器的各位无影响。
⑵存储标志寄存器(store register AH into Flag) 格式:SAHF
功能:把寄存器AH中的第7、6、4、2、0位的内容送至FR的SF、ZF、AF、PF、CF标志位,而FR的OF、DF、IF、TF各位不受影响。 ⑶标志位进栈(Push Flag) 格式:PUSHF
功能:将FR压入堆栈。该指令首先把堆栈指针SP减2,然后将16位标志寄存的全部内容送入SP指向的堆栈顶部字单元中。FR中各标志位本身不受影响。
进栈步骤:SP←SP-1;(SP)←(FR)H
SP←SP-1;(SP)←(FR)L
※堆栈采用“后进先出”原则。 ⑷标志位出栈(POP Flag) 格式:POPF
功能:将堆栈顶部的内容弹入标志寄存器。该指令首先根据SP找到堆栈顶部,并将堆栈顶部的一个字的内容送入FR,然后SP加2。FR中各标志位的状态,由从堆栈中弹出内容的相应位决定。
出栈步骤:(FR)L←(SP);SP←SP+1
(FR)H←(SP);SP←SP+1;
? PSHF和POPF一般用在子程序和中断处理程序的首尾,起保存和恢复
主程序标志的作用。
? FR中CF、DF、IF有专门指令进行修改,其余标志位都没有指令对它
们直接进行设置或修改。若要修改这些位,可首先用LAHF把含SF的FR低8位送入AH,对AH相应位进行修改,然后用SAHF送回FR。 ? 对TF位修改可先用PSHF将FR压入堆栈,在堆栈中设置TF,然后用
POPF返回。 5.地址传送指令。
该指令传送的是存储单元的地址,而不是它的内容。 ⑴装入有效地址(Load effective address):
①格式: LEA DST, SRC
②功能:将源操作数的有效地址(即偏移量EA)送到指定的寄存器。 ③举例:
LEA BX,0F62H [BX][SI]
若指令执行前:(BX)=0400H, (SI)=003CH 则指令执行后:(BX)=0400+003C+0F62=139EH
④说明:目的操作数一定是16位的通用寄存器;此指令对FR各位无影响。 ▲存放一个存储单元逻辑地址的地址指针需要4个byte,其中高16位(两个高字节)用来存放基址,低16位(两个低字节)用来存放偏移量。 ⑵LDS(Load DS with Pointer)指针送寄存器和DS: ①格式: LDS DST,SRC
②功能:把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。
③举例:
LDS SI ,[10H]
若指令执行前:(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H, 则指令执行后:(SI)=0180H,(DS)=2000H ⑶LES(Load ES With Pointer)指针送寄存器和ES ①格式: LES DST,SRC
②功能:把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI。 二、 算术运算类指令。 1.加法指令(Addition)
⑴格式: ADD DEST ,SRC
⑵功能: 目的操作数和源操作数相加,它们的和存放在目的操作数中,源操作数内容不变,即,DST←(DST)+(SRC) ⑶说明:
? DST:通用寄存器,存储器 ? SRC:通用寄存器,存储器,立即数 ? FR:影响CF、DF、AF、ZF、SF、OF