1,编译器只有在最终的Link阶段才会为代码和数据分配内存地址,因此指定代码段的地址一般是通过写一个link脚本来进行的。Link阶段时,编译器的Linker会读取你写的Link脚本,并且按照脚本的规定给代码分配地址。
2,根据ARM开发工具的不同,link脚本的语法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等开发工具都支持Link脚本。
如果你英文还可以,建议你直接找到开发工具的Help手册去研究。如果你英语实在不行,也可以把开发工具名称和你代码的具体情况告诉我,我帮你看看。
前些天,看到这个标题,直接过了,因为这个好像根本不是问题,结果过了几天,看这个问题还没有结果,于是好奇,进来看看。
RadASM只是一个开发环境,具体使用什么语言,你要有那个语言的编译和链接器,放在任何目录都可以,然后在对应那个语言的xxxx.ini中指定编译器和连接器的位置,如果是MASM宏汇编,那么需要在MASM.INI中指定,例如:
[Enviroment]
1=path,c:\masm32\bin
[CharTab]
2=025122252222223220-2F
3=111111111124222130-3F
[Open]
0="汇编源文件 (*.asm*.inc*.mac*.txt),*.asm*.inc*.mac*.txt"
1="资源文件 (*.rc),*.rc"
2="文本文件 (*.txt),*.txt"
3="所有文件 (*.*),*.*"
src="汇编文件 (*.asm),*.asm,asm"
hdr="头文件 (*.inc),*.inc,inc"
mod="模块 (*.asm*.mac),*.asm*.mac"
1=path 这个就是用来定义宏汇编编译器的地址,填上正确的地址即可。
至于汇编源程序,你完全可以如在DOS环境下使用的那样,例如:
.data
s1 db '这里放数据‘,0
.code
entry proc
mov eax, [eax].PEB.ImageBaseAddress
call GetCurrAddr
mov hInstance[ebx], eax
......
entry endp
.data
s2 db '这里也放数据,当然也可以放到前面去。
.code
start:
mov dest, offset Mz
mov clenth, Len
invoke GetCurrentDirectory,nBufLen, addr szFName
invoke lstrcat,addr szFName, addr myFName
invoke CreateFile,addr szFName, pointer to name of the file
GENERIC_WRITE or GENERIC_READ,access (read-write) mode
null, share mode
null, pointer to security attributes
CREATE_ALWAYS, how to create
FILE_ATTRIBUTE_NORMAL, file attributes
NULL
mov hFile, eax
invoke WriteFile,hFile,dest,clenth,addr br,NULL
.if eax
invoke lstrcpy,addr szFName,addr myFName1
invoke lstrcat,addr szFName,addr szOpenOk
invoke MessageBox,null,addr szFName,
addr szCaption,MB_OK
.else
invoke MessageBox,NULL,addr szOpenEr,
addr szCaption,MB_ICONERROR or MB_OK
.endif
invoke CloseHandle,hFile
xor eax, eax
invoke ExitProcess,eax
end start
编译链接后,代码从 start开始执行,start 的级别比 entry 高,如果代码中有entry,同时有start,那么编译后,结果是start,而不是entry,准确的说法是结尾 end 后面根的启动地址名称,随便叫什么都可以,习惯上用 start。
这是我以前写书时写的一些演示代码,都是在RadASM中开发的,代码绝对都可以编译运行的,我在附件里给你发一个汇编源代码,你可以试着用RadASM来编译一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)