汇编语言数据传送指令_汇编语言指令大全及实例解析「建议收藏」

汇编语言数据传送指令_汇编语言指令大全及实例解析「建议收藏」原文地址:http://www.tinpont.com/knowledge/assembly_instruction_move.html

汇编语言数据传送指令_汇编语言指令大全及实例解析「建议收藏」

原文地址:http://www.tinpont.com/knowledge/assembly_instruction_move.html

———————————————————————————–分割线———————————————————————————–

经过前面的学习,相信大家对寄存器产生了一点印象。现在我们来进一步学习汇编指令,加深对寄存器的印象。

寄存器,其实可以理解成系统规定名字的变量。在32位系统中,我们可以把寄存器理解成4个字节的无符号整形(unsigned int)变量。其实在内存的角度来看,所有数据都是以二进制保存的,之所以能展现出不同的内容,只不过是因为我们赋予了它们不同格式罢了。

MOV数据传送指令(move)

这个可以说是最最常见的赋值指令了,格式如下:

1
MOV dst,src

dst代表目标,src代表源,下面就不多解释了,大家习惯就好。可翻译成伪C代码 dst = src。

将src传送到dst,其中dst可以是地址,也可以是寄存器。而src可以是地址,可以是寄存器,也可以是立即数(也就是常数,写死的)。注意:dst不可以是立即数,src和dst不可以同时为地址,另外src和dst的数据长度必须相同(字节数相同)。例如:

1
2
3
4
5
6
7
8
9
10
11
MOV EAX,EBX   
//将寄存器EBX中的数值传送到EAX
MOV CX,DX   
//将寄存器DX中的数值传送到CX
MOV AL,01   
//将数值01传送到AL
MOV BX,0001   
//将数值0001传送到BX
MOV EAX,[204010AC]   
//将内存地址0x204010AC处开始的4字节数值传送到EAX
MOV ECX,[ESI+0AC]   
//将地址esi+0AC处的数值复制到ECX
MOV [204010AC],EAX   
//将EAX中的4字节数值复制到地址0x204010AC处
MOV
BYTE
PTR [204010AC],01   
//将1字节16进制数0x01复制到地址0x204010AC处
MOV
WORD
PTR [204010AC],2710   
//同上,因为WINDOWS是小端,所以该地址内容为0x10 0x27
MOV
BYTE
PTR [ESI+0AC],AL   
//将寄存器AL中的数值传送到ESI中的数值加上0xAC处(一个字节)
MOV
WORD
PTR [ESI+0AC],BX   
//将寄存器BX中的数值传送到ESI中的数值加上0xAC处(两个字节)

MOVSX 符号填充指令(move sign-extends)

带符号的扩展传送指令格式如下:

1
MOVSX dst,src

MOVSX和MOV指令相似,也是将src传送给dst,只是src的数据长度要小于dst,不足位用src的符号来填充。例如:

1
2
3
4
MOV AL,40   
//将数值0x40传送到AL(8位),40是正数(+64)
MOV BL,80   
//将数值0x80传送到BL(8位),80是负数(-128)
MOVSX CX,AL   
//将AL传送到CX(16位),则CX=0x0040(+64)
MOVSX DX,BL   
//将BL传送到DX(16位),则DX=0xFF80(-128)

MOVZX 零填充指令(move zero-extends)

零填充传送指令格式如下:

1
MOVZX dst,src

MOVZX和MOVSX指令相似,只不过不足位恒定用0来填充。例如:

1
2
3
4
MOV AL,40   
//将数值0x40传送到AL(8位)
MOV BL,80   
//将数值0x80传送到BL(8位)
MOVZX CX,AL   
//将AL传送到CX(16位),则CX=0x0040
MOVZX DX,BL   
//将BL传送到DX(16位),则DX=0x0080

XCHG 数据交换指令(exchanges)

1
XCHG dst,src

将dst和src中的数据相互交换,dst和src可以是寄存器,可以是内存,但不可以同时为内存。例如:

1
2
XCHG EAX,EBX   
//相当于TMP = EBX; EBX = EAX; EAX = TMP,该指令与XCHG EBX,EAX效果一样
XCHG AX,
WORD
PTR [20401000]   
// 把AX与地址0x20401000的数据交换

LEA有效地址传送指令(load effect address)

这个指令在大多数情况下用作运算,因为其支持同时多种运算方式,格式如下:

1
LEA dst,[src]

[]是取值符号,与指针的*取值类似,而LEA又是取地址指令,所以实际上上面的指令翻译成伪C代码应该是dst = src。

将有效内存地址数值传送到寄存器,其中dst只能是寄存器。而src可以是寄存器,也可以是立即数。例如:

1
2
3
LEA ESI,[204010AC]   
//其结果为ESI=204010AC,也就是[]内的有效数值
LEA EDI,[ESI+000000AC]   
//其结果为EDI=ESI+000000AC,也就是[]内的运算结果
LEA ECX,[EAX+EBX*4]
//其结果ECX=EAX+EBX*4,也就是[]内的运算结果

PUSH 数据入栈指令(push)

push指令多用于函数调用参数传递和环境保护,与pop天生一对。格式如下:

1
PUSH src

在寄存器介绍的时候我们已经知道ESP寄存器总是指向堆栈栈顶,而堆栈的使用是从高地址到低地址的。push指令首先会将esp减4(在32位系统下),再MOV [esp],src,例如:

1
2
PUSH EAX   
// 假设ESP的值为0x10,执行后ESP的值为0xC,[0xC] = EAX
PUSH 100   
// 假设ESP的值为0xC,执行后ESP的值为0x8,[0x8] = 0x100

POP 数据出栈指令(pop)

pop指令与push指令完全相反,格式如下:

1
POP dst

需要注意的是,dst必须为寄存器。pop指令首先会执行MOV dst,[esp],再将esp加4(在32位系统下),例如:

1
2
POP EAX   
// 假设ESP的值为0x10,[0x10] = 0x50,执行后EAX = 0x50,ESP = 0x14
POP ESI   
// 假设ESP的值为0x14,[0x14] = 0x60,执行后ESI = 0x60,ESP = 0x18

今天的文章汇编语言数据传送指令_汇编语言指令大全及实例解析「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89281.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注