能力值:
( LV2,RANK:10 )
2 楼
mov esi, lpfile
mov al, byte ptr [esi]
主要是byte ptr是何用
能力值:
( LV2,RANK:10 )
3 楼
mov esi, lpfile
lea edi, filetitle
这两个语句有什么区别,在我看来,它们应都 是
mov esi, lpfile
mov edi, filetitle
能力值:
( LV2,RANK:10 )
4 楼
这一小段看得不是很明白
;计算文件名(包括扩展名)
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
可以了,有了以上的基础,估计看起来要容易得多了。
能力值:
( LV2,RANK:10 )
5 楼
一块三毛钱的脱壳工具爽哦。。。。。
能力值:
( LV9,RANK:530 )
6 楼
问:
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
可以了,有了以上的基础,估计看起来要容易得多了。
答:
这一段应该是取得文件名的长度
能力值:
(RANK:410 )
7 楼
本人是做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上面继续循环操作。
可以了,有了以上的基础,估计看起来要容易得多了。
能力值:
(RANK:410 )
8 楼
回复后,才看到lnn1123兄已经回答了。
能力值:
( LV2,RANK:10 )
9 楼
谢谢楼上的帮助,那些是看代码的基础,有了它发现看起来确是轻松多了。
这儿的代码基本上是看懂了,但其中的地址细节不是很明了。
;计算文件名(包括扩展名)
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打的断点有何用?
能力值:
( LV2,RANK:10 )
10 楼
在程序中加上
include \RadASM\masm\inc\radbg.inc
include \RadASM\masm\inc\debug.inc
includelib \RadASM\masm\lib\debug.lib
会在断点的地方弹出RadASM断点对话框,不过信息太少了。
无法将OD调试与断点相连,虽然已将路径设好了,在调试器中运行时也能将OD激发出来,但断点还是不起作用,不能在我想要的语句上断下来。
呵呵,这点要做到,就类以于VC编译器了。