汇编网首页登录博客注册
e56004474的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言

[2012-06-12 09:32] <<INTEL汇编语言程序设计>> 代码编译,链接,运行

<<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,一般在命令行照上面的方法做,能正常显示了。
这是比较笨的办法了。
评论次数(1)  |  浏览次数(825)  |  类型(Intel 汇编语言程序设计) |  收藏此文  | 

[  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'

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码