首页
社区
课程
招聘
几个简单的指令意思
2006-10-2 00:59 5111

几个简单的指令意思

2006-10-2 00:59
5111
本人是做VC开发的,相信语言最好的学习就是结合代码看程序。
汇编指令的书也看过一些。不过研究的不是很深。
以下是看
;*************************************************************
;*      Author: 一块三毛钱
;*      E_mail: crazy_soft@163.net
;*    Homepage: http://zhongts.51.net
;*************************************************************
;*     Compile: Hutch's Masm32
;* Create Time: 2002.6.5
;*      Modify: 2002.6.5
;* Description: 文件分割器 V1.10
;*************************************************************
程序的时候遇到的一些问题。很简单,不过暂时自己解决不了。

这些指令的意思不是很明白。

invoke  lstrcat, addr strIniFilePath, addr strModuleDir

mov     esi, offset strFileName
主要是不明白它们两个有什么区别,不用管invoke

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Luis 2006-10-2 01:30
2
0
mov     esi, lpfile
        mov     al, byte ptr [esi]
主要是byte ptr是何用
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Luis 2006-10-2 01:33
3
0
mov     esi, lpfile
        lea     edi, filetitle
这两个语句有什么区别,在我看来,它们应都 是
        mov     esi, lpfile
        mov     edi, filetitle
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Luis 2006-10-2 01:37
4
0
这一小段看得不是很明白       
;计算文件名(包括扩展名)
        mov     esi, lpfile
        lea     edi, filetitle
        invoke  StrLen, lpfile
        add     esi, eax
        xor     ecx, ecx
        labelTest:
                cmp     BYTE ptr [esi], '\'
                je      labelExit
                dec     esi
                inc     ecx
                jmp     labelTest

可以了,有了以上的基础,估计看起来要容易得多了。
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 2006-10-2 13:33
5
0
一块三毛钱的脱壳工具爽哦。。。。。
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
lnn1123 13 2006-10-2 17:00
6
0
问:
invoke lstrcat, addr strIniFilePath, addr strModuleDir
mov esi, offset strFileName
主要是不明白它们两个有什么区别,不用管invoke
答:
不明白你的意思
问:
mov esi, lpfile
mov al, byte ptr [esi]
主要是byte ptr是何用
答:
byte ptr是按字节取的
例如
lpfile 1234
mov esi, lpfile
mov al, byte ptr [esi]
al=12

问:
mov esi, lpfile
lea edi, filetitle
这两个语句有什么区别,在我看来,它们应都 是
mov esi, lpfile
mov edi, filetitle
答:
这两个语句有区别的,
例如:
1:如果filetitle是指针的话这2个语句就不一样了,
filetitle存放的内存地址是a
lea edi, filetitle //edi=a
mov edi, filetitle //edi=addr filetitle
问:
这一小段看得不是很明白
;计算文件名(包括扩展名)
mov esi, lpfile
lea edi, filetitle
invoke StrLen, lpfile
add esi, eax
xor ecx, ecx
labelTest:
cmp BYTE ptr [esi], ''
je labelExit
dec esi
inc ecx
jmp labelTest

可以了,有了以上的基础,估计看起来要容易得多了。
答:
这一段应该是取得文件名的长度
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-10-2 17:14
7
0
本人是做VC开发的,相信语言最好的学习就是结合代码看程序。
汇编指令的书也看过一些。不过研究的不是很深。
以下是看
;*************************************************************
;*      Author: 一块三毛钱
;*      E_mail: crazy_soft@163.net
;*    Homepage: http://zhongts.51.net
;*************************************************************
;*     Compile: Hutch's Masm32
;* Create Time: 2002.6.5
;*      Modify: 2002.6.5
;* Description: 文件分割器 V1.10
;*************************************************************
程序的时候遇到的一些问题。很简单,不过暂时自己解决不了。

这些指令的意思不是很明白。

invoke  lstrcat, addr strIniFilePath, addr strModuleDir

mov     esi, offset strFileName
主要是不明白它们两个有什么区别,不用管invoke


不用管invoke是什么意思?这里不太清楚你想知道什么。下面随便说一下。

lstrcat是一个字符串连接函数,invoke  lstrcat, addr strIniFilePath, addr strModuleDir是将strIniFilePath和strModuleDir里保存的字符连接在一起,连接后的字符串保存在strIniFilePath里。

mov esi, offset strFileName是将strFileName变量的地址传给esi。

其中,addr和offset两个指令都是取变量的地址。他们的差别在于:一、addr只能取前面变量的地址,而offset可以取后面的变量地址,二、addr可以取函数里的局部变量地址,而offset只能取全局变量的地址。


mov     esi, lpfile
  mov     al, byte ptr [esi]
主要是byte ptr是何用

Byte ptr 是告诉程序,mov al,byte ptr [esi]只取[esi]中保存的数据以一个Byte字节大小给al。

mov     esi, lpfile
  lea     edi, filetitle
这两个语句有什么区别,在我看来,它们应都 是
  mov     esi, lpfile
  mov     edi, filetitle

mov esi, lpfile是取盒子里放着的东西,而lea edi,filetitle是取盒子,他们的意思怎么会是一样呢。

这一小段看得不是很明白  
;计算文件名(包括扩展名)
  mov     esi, lpfile ; 取出lpfile保存着的地址给esi
  lea     edi, filetitle ; 将filetitle的地址给edi
  invoke  StrLen, lpfile ; 获取lpfile保存着的字符串地址保存着的字符串长度
  add     esi, eax ; 字符串地址加上字符串长度,使esi指向字符串的最后一位字符。
  xor     ecx, ecx ; ecx清0,准备作计数器为下面的循环操作作准备。
  labelTest:
    cmp     BYTE ptr [esi], '' ;比较循环取出[esi]指向的字符串是不是已经结束。
    je      labelExit ;如果结束则退出循环。
    dec     esi ;地址减1
    inc     ecx ;计数加1
    jmp     labelTest ;跳回labelTest上面继续循环操作。

可以了,有了以上的基础,估计看起来要容易得多了。
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-10-2 17:15
8
0
回复后,才看到lnn1123兄已经回答了。
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Luis 2006-10-3 12:34
9
0
谢谢楼上的帮助,那些是看代码的基础,有了它发现看起来确是轻松多了。
这儿的代码基本上是看懂了,但其中的地址细节不是很明了。
        ;计算文件名(包括扩展名)
1        mov     esi, lpfile
2        lea     edi, filetitle
3        invoke  StrLen, lpfile
4        add     esi, eax
5        xor     ecx, ecx
6        labelTest:
7                cmp     BYTE ptr [esi], '\'
8                je      labelExit
9                dec     esi
10                inc     ecx
11                jmp     labelTest
12        labelExit:
13        inc     esi
14        dec     ecx
15        rep     movsd;传送文件名mod by luis 20061003
先假设lpfile和filetitle分别的地址和存放的内容:
lpfile:"d:\test.exe"     addr:0x0040010
filetitle:""     addr:0x00403100

1 esi中存的是0x0040010
2 edi中存的是什么?
这种传送指令的命令15觉得应是两个参数是等价的,即都是字符串的首地址,可是从这几句代码中看明显不是这样。

另外,其实这几个代码若是在调试状态一下子就能明白个七七八八了,不过我在RadASM中相应的代码下打断点,按ALT+F8,然后选在调试器中运行,直接转到OD下调试,居然经过断点而不起作用,那这个断点有何用处?实在不是很明白。也可能是我的设置有问题。

OD能否认得RadASM所打的断点?不能认出的话RadASM打的断点有何用?
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Luis 2006-10-3 12:58
10
0
在程序中加上
include \RadASM\masm\inc\radbg.inc
include \RadASM\masm\inc\debug.inc
includelib \RadASM\masm\lib\debug.lib
会在断点的地方弹出RadASM断点对话框,不过信息太少了。
无法将OD调试与断点相连,虽然已将路径设好了,在调试器中运行时也能将OD激发出来,但断点还是不起作用,不能在我想要的语句上断下来。

呵呵,这点要做到,就类以于VC编译器了。
游客
登录 | 注册 方可回帖
返回