POP d:将堆栈中当前栈顶两相邻单元的数据字弹出到d
压栈指令PUSH AX:将AX(16位)中的数据压入栈,AX是源操作数,栈顶是目的操作数,由(SS:SP)指向。
出栈指令POP AX:将栈顶信息弹出到AX中,AX是目的操作数,栈顶是源操作数,由(SS:SP)指向。
设当前CS=1000H,IP=0020H,SS=1600H,SP=004CH,则该指令执行时,将当前栈顶两相邻单元1604CH与1604DH中的数据字弹出并传送到CX中,同时修改堆栈指针,SP+2→SP,使之指向新栈顶1604EH。
堆栈是内存中开辟的一个段,存放需要保护的信息(数据、地址)。堆栈操作时应遵循的5点原则:
堆栈的存取操作每次必须是一个字(即2个字节)。
执行压栈指令时,总是从高位地址向低位地址存放数据,而不象内存中的其他段,总是从低地址向高地址存放;执行出栈指令时,从堆栈中弹出数据则正好相反。 堆栈段在内存中的物理地址由SS和SP或SS和BP决定,其中,SS是堆栈段寄存器,它是栈区的最低地址,称为堆栈的段地址;SP是进栈或出栈指令隐含的堆栈地址指针,它的起始值是堆栈应达到的最大偏移量,即指向栈顶地址。堆栈段的范围是SS×16至SS×16+SP的起始值。每执行一次压栈指令,则SP-2,推入堆栈的数据放在栈顶;而每执行一次弹出指令时,则SP+2。BP寄存器用于对堆栈中的数据块进行随机存取,例如,MOV AX,[BP][SI]指令执行后,将把偏移量为BP+SI的存储单元的内容装入AX。
堆栈指令中的操作数只能是寄存器或存储器操作数,而不能是立即数。
对CS段寄存器可以使用压栈指令PUSH CX,但却不能使用POP CS这种无效指令。
(3)XCHG d,s
该指令功能是将源操作数与目标操作数(字节或字)相互对应交换位置。交换可以在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行。但不能在两个存储单元之间交换,段寄存器与IP也不能作为一个源或目的操作数。 (4)XLAT
这是一条用于实现字节翻译功能的指令,又称为代码转换指令。具体地说,它可以将AL寄存器中设定的一个字节数值变换为内存一段连续表格中的另一个相应的代码,以实现编码制的转换。 2)目标地址传送指令
专用于传送地址码的指令,可传送存储器的逻辑地址(即存储器操作数的段地址或偏移地址)至指定寄存器中,共包含3条指令:LEA、LDS和LES。 (1) LEA d,s
取有效地址指令。功能:把用于指定源操作数(它必须是存储器操作数)的16位偏移地址(即有效地址)传送到一个指定的16位通用寄存器中。 (2) LDS d,s
取某变量的32位地址指针指令。功能:从由指令的源s所指定的存储单元开始,由4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到由指令的目标d所指定的某16位通用寄存器,后两字节(即变量的段地址)传送到DS段寄存器中。 (3) LES d,s
这条指令与LDS d,s指令的操作基本相同,其区别仅在于将把由源所指定的某变量的地址指针中后2个字节(段地址)传送到ES段寄存器,而不是DS段寄存器。
3)标志位传送指令
用于传送标志位,共有4条。
(1) LAHF指令功能:将标志寄存器F的低字节(共包含5个状态标志位)传送到AH寄存器中,双操作数,固定寻址,所以被隐藏。
(2)SAHF指令功能:将AH寄存器内容传送到标志寄存器F的低字节。
(3)PUSHF指令功能:将16位标志寄存器F内容入栈保护。其操作过程与前述的PUSH指令类似。
(4)POPF指令功能:将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中。 4)I/O数据传送指令 (1)IN累加器,端口号
端口号可以用8位立即数直接给出;也可以将端口号事先安排在DX寄存器中,间接寻址16位长端口号(可寻址的端口号为0~65535)。IN指令是将指定端口中的内容输入到累加器AL/AX中。 (2)OUT 端口号,累加器
与IN指令相同,端口号可以由8位立即数给出,也可由DX寄存器间接给出。OUT指令是将累加器AL/AX中的内容输出到指定的端口。
OUT PORT,AL ;端口PORT←AL,即将AL中的字节内容输出到由PORT直接指定的端口。PORT:符号地址,表示端口直接地址。
OUT DX,AX ;端口(DX)←AX,即将AX中的字内容输出到由DX所指定的端口。 I/O指令只能用累加器作为执行I/O数据传送的机构,直接寻址范围为0~255,寻址大于255的端口地址时,必须用间接寻址的I/O指令。例如,在IBM PC/XT微机系统中,既用了0~255范围的端口地址,也用了255~65535范围的端口地址。
2.算术运算指令 1)加法指令
(1) ADD d,s ;d←d+s
指令功能:将源操作数与目标操作数相加,结果保留在目标中。并根据结果置标志位。
源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数不允许是立即数,其他同源操作数。且不允许两者同时为存储器操作数。 (2)ADC d,s;d←d+s+CF
带进位加法(ADC)指令的操作过程与ADD指令基本相同,惟一的不同是进位标志位CF的原状态也将一起参与加法运算,待运算结束,CF将重新根据结果置成新的状态。
ADC指令一般用于16位以上的多字节数字相加的软件中。 (3)INC d;d←d+1
指令功能:将目标操作数当作无符号数,完成加1操作后,结果仍保留在目标中。 目标操作数可以是8/16位通用寄存器或存储器操作数,但不允许是立即数。 2)减法指令
(1)SUB d,s;d←d-s
指令功能:将目标操作数减去源操作数,其结果送回目标,并根据运算结果置标志位。
(2)SBB d,s;d←d-s-CF
本指令与SUB指令的功能、执行过程基本相同,唯一不同的是完成减法运算时还要再减去进位标志CF的原状态。运算结束时,CF将被置成新状态。
(3)DEC d; d←d-1
减1指令功能:将目标操作数的内容减1后送回目标。
目标操作数可以是8/16位通用寄存器和存储器操作数,但不允许是立即数。 (4)NEG d; d←d+1
NEG是求补码的指令,简称求补指令。指令功能:将目标操作数取负后送回目标。 (5)CMP d,s;d-s,只置标志位
指令功能:将目标操作数与源操作数相减但不送回结果,只根据运算结果置标志位。
不允许两个操作数同时为存储器操作数,也不允许做段寄存器比较。 3)乘法指令
乘法指令用来实现两个二进制操作数的相乘运算,包括两条指令:无符号数乘法指令MUL和有符号数乘法指令IMUL。 (1) MUL s
MUL s是无符号乘法指令,被乘数(目的操作数)隐含在累加器AL/AX中;由s指定的源操作数作乘数,相乘所得双倍位长的积,分别存放到DX与AX中。 (2)IMUL s有符号乘法指令 4)除法指令
除数、商:8位,被除数可以是16位,目的操作数被隐含。 (1) DIV sDIV s
被除数隐含在累加器AX(字节除)或DX、AX(字除)中。指令中由s给出的源操作数作除数。
字节除法,商存于AL,余数存于AH。