<<INTEL汇编语言程序设计>> 代码编译,链接,运行
<<INTEL汇编语言程序设计>> 代码编译
前一周去中关村,看了一下Thinkpad T61的样机,结论是:很想要,可惜银两不足,虽然Ricky答应帮从米国带一台,也只能算了...然后去图书大厦买了一本<<INTEL 汇编语言程序设计 第5版>> 一直以来也很想要的书,回来的时候还淋了场雨,所幸,书没湿,然后花了差不多一周的时间就把书的内容看了大半
还是那句话,真正的好书首先是很容易懂,而且之前看了不少C的反汇编代码,所以差不多都是一晚一章,虽然很辛苦,可是很有乐趣,感觉看<<天龙八部>>似的,看完以后感觉还是有些没吃饱,还想了解更多,呵呵
下午到公司,想把书上的代码编译出来,结果就像K&R上说的,新手即使是编译一个很简单的程序也不容易,因为首先得熟悉环境和工具,所以花了很大力气,比较气人的是群里一人,居然还教训我,怎么怎么着...其实他自己也未必懂,现在很多人都是这样,一有问题马上就问,其实很多时候还得靠自己
4版跟了一张光盘,有编译器和代码,编译器是MASM 6.1
--------------------------------------------------------------------------------
TITLE Add and Subtract (AddSub.asm)
; This program adds and subtracts 32-bit integers.
; Last update: 2/1/02
INCLUDE Irvine32.inc
.code
main PROC
mov eax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 30000h
call DumpRegs
exit
main ENDP
END main
--------------------------------------------------------------------------------
代码如上,非常的简单,就是说对EAX进行操作,最后把寄存器里的值打印出来,但是一编译的话,就提示我没有声明符号
unresolved external symbol _DumpRegs@0
unresolved external symbol _ExitProcess@4
BAIDU,GOOGLE,CSDN全用上了,最终还是凭借了一篇文章了解了原因
1)在编译ASM时,应指定INC文件所在的目录
2)在链接OBJ时,应指定程序里使用的LIB文件的目录
3)应该在代码里添加 Irvine32.lib Kernel32.lib 的引用
--------------------------------------------------------------------------------
TITLE Add and Subtract (AddSub.asm)
; This program adds and subtracts 32-bit integers.
; Last update: 2/1/02
INCLUDE Irvine32.inc
Includelib Kernel32.lib
Includelib Irvine32.lib
.code
main PROC
mov eax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 30000h
call DumpRegs
exit
main ENDP
END main
--------------------------------------------------------------------------------
(注:开始--运行--输入cmd或者command,回车,之后输入以下命令!)
编译链接指令如下
ML.EXE /C /COFF /I C:\Masm615\INCLUDE 1.asm
LINK32.EXE /SUBSYSTEM:CONSOLE /LIBPATHC:\Masm615\LIB 1.obj
/C 是告诉编译器编译的同时不生成可执行文件
/COFF 产生的 obj文件格式为COFF格式 貌似只有这个格式链接器才能认识
/I 指定INCLUDE目录 I和盘符之间可以有空格
/SUBSYSTEM:CONSOLE win32汇编程序在链接时需要指定是windows程序还是控制台程序
/LIBPATH 指定LIB目录 注意H和盘符之间没有空格
--------------------------------------------------------------------------------
kernel32l.lib 包含了系统函数的引用,如果缺少它,代码里调用了exit,链接时就会出现缺少声明的提示
Irvine32.lib是一个静态库,是<<Intel汇编语言程序设计>>的作者Kip Irvine写的一个控制台程序专用函数库,如果缺少了,随书代码里一些有用的函数就不能使用了,而这本书为什么容易呢?就是因为作者编写了一些有用的函数适当的屏蔽了复杂性,在不需要详细了解的情况下,就不讲,只是告诉一下,这个函数大概的功能,你这样使用就可以了
最后:
不知道是什么原因,作者的程序里似乎没有包含LIB的那两行,而这样的话编译书里的代码,每个程序都得加上这两行了,似乎不是很好
所以我试了一下,在Irvine32.inc文件的末尾加上
Includelib Kernel32.lib
Includelib Irvine32.lib
就可以不用在每个代码文件里加上这样的代码了
=======================================================
转自csdn.
Includelib Kernel32.lib 这个源代码中一般是没有的,所以,缺少这个,编译会通不过,估计99%的新人要被坑。
如果你能编译通过了,运行却显示不出来(双击程序或者在commandg下运行)那么就是错在了LINK32.EXE /SUBSYSTEM:CONSOLE 上了。
由于我先看了琢石成玉那本书 怎么编译的方法,makefile文件里的是‘LINK32.EXE /SUBSYSTEM:window',所以编译通过了,却怎么也显示不了。。。
建议先到csdn里下载配套的光盘代码,自带了masm615,一般在命令行照上面的方法做,能正常显示了。
这是比较笨的办法了。
- [e56004474] 7.以上做完,用LordPE修改好入口点,其次“目录表”中的“输入表”地址修正好。以上做好,基本就没 11/23 10:06
- [e56004474] 6.ImportREC修复输入表时,如果其中一条函数无法正常识别,fix Dump出来的文件,需要 11/23 10:02
- [e56004474] 5.浏览时图片显示了一小部分,请点击下图片,会全部正常显示。 11/23 09:57
- [游客] 我的理解是书上印错了 07/08 15:56
- [e56004474] STDCALL调用 方式,把要导出的过程名修改为以下格式: _name@nn 06/10 14:48
- [e56004474] option casemap:none 指明大小写 是否敏感. (《啄石成玉》第3章才有说明) 03/23 17:34
- [e56004474] 编译链接指令如下 ML.EXE /C /COFF /I C:\Masm615\INCLUDE 1 03/17 19:47
- [starrynight] 加油! 10/09 17:31
- [fpamc] 串个门儿~ 08/15 06:52
- [chinatree] 没看懂你最后一句再说什么。 07/23 00:07
[ e56004474 发表于 2014-03-17 19:47 ]
编译链接指令如下
ML.EXE /C /COFF /I C:\Masm615\INCLUDE 1.asm
LINK32.EXE /SUBSYSTEM:CONSOLE /LIBPATHC:\Masm615\LIB 1.obj
修改:
ML.EXE /c /coff ;应该为小写,后面的需要看你的文件具体在哪
========================
由于我先看了琢石成玉那本书 怎么编译的方法,makefile文件里的是‘LINK32.EXE /SUBSYSTEM:window'
修改为‘LINK32.EXE /SUBSYSTEM:windows'