1.mov在上篇文章中已经介绍
2.PUSH和PoP指令都必须根据当前SP的内容来确定进栈或出栈的存储单元,而且必须及时修改指针,以保证(SP)指向当前的栈顶。
(1) 堆栈的存取必须以字为单位,(IBM PC中不允许字节堆栈),所以PUSH和POP指令只能作字操作。
(2) 它们可以使用初立即数以外的其他寻址方式。
(3) 指令也可以指定段寄存器作为操作数,注意POP绝对不能使用代码段(CS)寄存器。
(4) 这两条指令不影响标志位。
利用堆栈进行现场保护:
push AX
push BX
.
.其他要执行的程序
.
pop BX
pop AX
注意进出栈的顺序。
3.
XCHG交换指令
格式为 XCHG OPRl, OPR2
执行操作: (OPRl) 〈一一〉 (OPR2)其中OPR表示操作数。该指令的两个操作数中必须有一个在寄存器中,因此,它可以是寄存器之间;寄存器和存储器之间交换信息,注意不能使用段寄存器。指令允许字和字节操作,且不会影响标志位。
4.累加器专用传送指令
IN (input) 输入
OUT (output) 输出
XLAT(Translate) 换码
这组指令只限于使用累加器AX和AL传送信息。
注意:
(1) 所有的I/O端口与CPU之间的通信都由IN和OUT指令来完成。其中IN完成从I/O到CPU的信息传送,而OUT完成从CPU到I/O的信息传送。
(2) CPU只和累加器(AX或AL)进行接收或发送信息,外部最多可以有64K个端口,端口号为0000H – FFFFH。
(3) 长格式:对于前256个端口,可以在指令中直接指定,这就是常格式的端口(PORT)。
(4) 短格式:当端口号大于等于256时,则必须先将端口号置于DX寄存器中,然后再利用IN或OUT进行信息的传递。
(5) 注意,在利用IN/OUT进行信息传递时,所有的端口号(或DX的内容)均为地址,而传送的均为端口号的内容。
输入、输出指令不影响标志位。
例 IN AX,28H
MOV DATA_WORD , AX
这两条指令把地口28的内容经过AX传送到存储单元DATA_WORD中。
例 MOV DX,3FCH
IN AX,DX
从端口03FCH送一个字到AX寄存器中。
例 OUT 5, AL
从AL寄存器输出一个字节到端口5
5.XLAT换码指令
格式为; XLAT OPR
或 XLAT
执行的操作: (AL) 〈一 ((BX)十(AL))
功能:将一种代码转换为另一种代码。
在使用这条指令之前,应该先建立一个字节表格,表格的首地址提前存入BX寄存器,需要转换的代码应该是相对于表格首地址的位移量也提前存放在AL寄存器中,表格的内容则是需要转换的代码,该指令执行后就可在AL中得到转换后的代码。
该指令可以使用XLAT或XLAT OPR两种格式中的任一种,使用XLAT OPR时,OPR为表格的首地址(一般为符号地址),但在这里的OPR只是为提高程序的可读性而设置的,指令执行时只使用预先已存入BX中的表格首地址,而并不用汇编格式中指定的值。该指令不影后标志位。
例 如(BX) = 0040H,(AL)=0FH,(Ds)=F000H
指令 XLAT
把 F0000H+0040H+0FH的内容送AL,所以指令执行后:(AL) = 2CH
即指令把AL中的代码0FH转换为2CH。
必须注意,由于AL为8位二进制位,所以表格的最大长度不能超过256。
6.地址传送指令
LEA 有效地址送寄存器
LDS 指针送寄存器和DS
LES 指针送寄存器和ES
这一组指令完成把地址送到指定寄存器的功能。
1.LEA 有效地址送寄存器
格式: LEA REG,SRC
执行过程: (REG)<- SRC
完成功能: 指令将有效地址送到指定的寄存器中。
2.LDS 指针送寄存器和DS
格式: LDS REG,SRC
执行的操作:(REG)〈一(SRC)
(DS)〈- (SRC十2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。该指令通常用来指定SI寄存器。
3.LES 指针送寄存器和ES
格式: LES REG,SRC
执行的操作:(REG)〈一(SRC)
(ES)〈- (SRC十2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令通常用来指定DI寄存器。
注意:以上三条指令,不能指定段寄存器,指令操作不影响标志位
本组指令把变量的偏移地址(LEA)或段地址和偏移地址(LDS和LES)送给寄存器,以提供访问变量的工具。
例 : LEA BX,[BX十SI十0F62H]
如指令执行前 (BX)=0400H,(SI)=003CH
则指令执行后 (BX)=0400十003C十0F62=139EH
必须注意,在这里BX寄存器得到的是偏移地址而不是该存储单元的内容。
例: LDS SI,[10H]
如指令执行前 (DS)=C000H,(C0010H)=0180H,(C0012H)=2000H
则指令执行后 (S1)=0180H,(DS)=2000H
例 LES DI,[BX]
如指令执行前 (DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H
则指令执行后 (D1)=05AEH, (ES)=4000H
7. 标志位寄存器传送指令
LAHF 标志寄存器的低字节送AH
SAHF AH送标志寄存器的低字节
PUSHF 标志进栈
POPF 标志出栈
1.LAHF 标志送AH指令
格式为: LAHF
执行的操作: (AH)〈- (PSW寄存器的低字节)
2.SAHF AH送标志寄存器指令
格式为: SAHF
执行的操作:(PSW的低字节)一〉(AH)
3.PUSHF 标志进栈指令
格式为; PUSHF
执行的操作: (SP) 〈- (SP)-2
((SP)+1,(SP))〈- (PSW)
4.POPF 标志出栈
格式为:POPF
执行过程为: (PSW) 〈-- ((SP)十1,(SP))
(SP) 〈一 (SP)十2
这组指令中的LAHF和PUSHF不影响标志位。SAHF相POPF则由装入的值来确定标志位的值