我在标题中加入了“正确”两个字,是因为我已经基本能获取到机器码了,但还有瑕疵:
首先在 x86 模式下,只要按照正确的格式写一段代码:
.686
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
.code
mov eax, offset @F
; 别管上面这句有啥用,我最主要没解决的问题就在这儿
@@:
; 其他代码
end
也有说“.code”后面要加个标签,比如 start:,最后的 end 改为 end start
但是我试了试,没有这个标签一样可以编译,加了标签也没解决我的问题;
更正以下:没有标号编译OBJ文件没问题,但是链接EXE好像出错(但这不是本文重点!)
不链接的话:
ml.exe /c /coff xxx.asm
带链接的话:
ml.exe /coff xxx.asm /link /subsystem:windows
然后呢,不管是COFF还是PE的格式我是知道的,按照格式解析出来代码段就可以了,这些我都实现了。
但是,就这个
mov eax, offset @F 把我难住了:
1、对于从 COFF(OBJ文件)获取代码段来说,这句的机器码是
B8 00 00 00 00
其实就是 mov eax, 0 了,这个偏移量根本没获取啊???
2、后来我链接成PE文件,从EXE中获取的机器码是
B8 05 10 40 00
也就是 mov eax, 401005h,有偏移量了,但不是我想要的,好吧我想到PE默认基址是 400000h,所以我这么链接:
ml.exe /coff xxx.asm /link /subsystem:windows /base:0
这下 400000h 没了,机器码成了
B8 05 10 00 00
晕了,这也不是我想要的啊,那个 1000h 是个啥?
我想要的结果就是从我代码第一句开始(地址为 0)开始计算偏移,说白了像例子中的那句
mov eax, offset @F
我只要得到的机器码是
B8 05 00 00 00
也就是 mov eax, 05h,因为这一句就5个字节,偏移过去正好就是下一句代码了。。。
但是我该怎么设置呢?请原谅我对 ml.exe 和 link.exe 的选项了解的并不多,MSDN和百度都搜索了没有讲的太明白的,或者说一点不通俗,看不懂^_^
1、没办法从 OBJ 文件里能获取我要的结果么?
2、要是不行就链接完了取吧,但是怎么设置编译的参数才能让它没那个 1000h 呢?
谢谢帮助!!!
PS:我的 ml.exe 和 link.exe 都是从 VS2017 提取的,不是MASM8的,都14+的版本了,因为我要编译一些 SSE 指令,就想着用最新的了。