汇编指令

Posted kensporger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编指令相关的知识,希望对你有一定的参考价值。

数据传送指令

 

数据交换指令

  完成两个操作数间的数据交换,操作数可以是寄存器和存储单元,但是不能两个都是存储单元(与MOV指令一样,可以用寄存器作为中间媒介)。并且,段寄存器不能作为操作数。下面代码需注意VAR1的默认段是CS,而VAR1[BP]默认是SS段,如果这两个段偏移不同,则变量VAR1最终不能还原到0012H。

MOV BP,0000H;          
XCHG BX,[BP+SI];
XCHG BX,VAR1; //交换VAR1和BX的值       
XCHG BX,VAR1[BP];//交换SS:BP+VAR1地址内容和BX的值
ret   
VAR1 DW 0012H;

 

地址传送指令

  把源操作数的偏移地址传到目的操作数,相当于MOV OFFSET。对于[寄存器值]类似的形式,就是去括号的过程;对于变量,尤其注意传送的不是变量的值。

LEA BX, [BP];//把BP赋给BX
LEA AX,VAR1;//把VAR1的偏移地址赋给AX
MOV AX,OFFSET VAR1;

 

地址指针传送指令

  该类指令获取双字的存储内容,将内容的高16位送入段寄存器,低16位送给目的寄存器。其中,LDS将高16位送入DS段寄存器,LES则送入ES段寄存器。源操作数为变量或者寄存器间接寻址方式(这里狭义地将出现方括号和寄存器的所有寻址方式统称为寄存器间接寻址)。

  下例中首先将变量VAR1的低16位0012H送到BX,高16位0100H送到DS;之后用LES指令对AX赋值0012H,并且将ES改为了0100H;

LDS BX,VAR1;
MOV [BX],0012H;
MOV [BX+2],0100H; 
LES AX,[BX];
ret   
VAR1 DD 01000012H;

 

堆栈操作指令

  堆栈是存储器的一部分,其地址由SS段和SP段管理。栈底地址较大,栈顶地址较小。初始化一个空堆栈后,SP指向栈底,当压入数据后,SP指向栈顶,堆栈结构如下图所示(栈底永远都是空的)。

技术图片

 

  PUSH操作时,先修正SP的值(减2),再将字型数据填入SP所指位置;POP操作相反,先将栈顶的字型数据送出,然后修正SP的值(加2)。下例三次压入后,SP值为00F9H,三次弹出以后,SP又回到00FFH。

MOV AX,0100H;
MOV SS,AX;
MOV SP,00FFH;//初始化堆栈

PUSH AX;//压入0100H
PUSH 0202H;//压入0202H
PUSH VAR1;//压入0303H    

POP BX;//弹出0303H
POP BX;//弹出0202H
POP BX;//弹出0101H

ret
VAR1 DW 0303H;

 

 

未完待续···

 

以上是关于汇编指令的主要内容,如果未能解决你的问题,请参考以下文章

汇编指令JMP是啥意思?

汇编 LEA 指令

用于复数乘法的汇编代码/AVX 指令。 (GCC 内联汇编)

汇编学习笔记-伪指令

逆向工程部分

汇编指令机器码说明