首页
社区
课程
招聘
[求助]请教有智慧的大哥大姐个比较入门的问题
发表于: 2007-12-14 18:06 4072

[求助]请教有智慧的大哥大姐个比较入门的问题

2007-12-14 18:06
4072
昨天看了汇编语言指令,在看CrackMe的反编译指令时有些地方不是很明白,请问:
LEA ESI,DWORD PTR DS:[ESI+ESI*4] 我知道这个是取有效地址命令,PTR DS:这里面是什么意思啊?DS为段地址积存器吧?为什么这样写呢 为什么不是
LEA ESI DWORD [ESI+ESI*4]? PTR是什么意思啊?
还有用什么命令参看堆栈里面的内容呢?D 吗?

[课程]Android-CTF解题方法汇总!

收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 44229
活跃值: (19955)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
LEA ESI,DWORD PTR DS:[ESI+ESI*4] 这句是优化指令,相当于esi=ESI+ESI*4=5*ESI
2007-12-14 20:44
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢看雪老大,老大亲自指导倍感荣幸!
2007-12-15 19:13
0
雪    币: 256
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
为了使指令中存储单元操作数具有明确的属性,我们可以使用强制属性操作符PTR。其一般格式为:

数据类型 PTR 地址表达式

其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。

为了明确指令中存储单元的属性,可把指令“MOV [BX], 1H”可改写成:

MOV  byte ptr [BX], 1H   或  MOV  word ptr [BX], 1H

在指令中用操作符PTR强制后,不管其后的地址表达式原数据类型是什么,在本指令中就以PTR前面的类型为准。该强制属性只在本指令有效,是一种临时性的属性,它不会改变原内存单元的定义属性。

例如:

W1 DW 1234H, 5678H
B1 DB 2
DB 5
D1 DD 23456789H

MOV AX, word ptr b1 ;把B1开始的二个字节拼接成一个字,执行后,(AX)=0502H
MOV BH, byte ptr w1  ;把字W1的低字节传送给BH,执行后,(BH)=34H
MOV CH, byte ptr w1+1 ;把字W1的高字节传送给CH,执行后,(CH)=12H
MOV word ptr d1, 12H  ;把双字D1的低字修改成0012H,执行后,(D1)=23450012H

上面指令中的强制属性是临时属性,它不能改变这些变量在定义时的永久属性。
2007-12-15 19:25
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
真是详细,明白了PTR是程序要为数据建立临时属性的意思。
"LEA ESI,DWORD PTR DS:[ESI+ESI*4] "
DS :是不是可以理解为ESI中的数据的段地址在DS寄存器中呢?
2007-12-15 19:37
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
万分感谢,解释的很详细。
2007-12-15 20:19
0
游客
登录 | 注册 方可回帖
返回
//