在ARM汇编编程中如何指定某段程序的存储地址

在ARM汇编编程中如何指定某段程序的存储地址,第1张

在要指定代码的存储空间不是一件特别简单的事情,尤其是你想为某个或某几个函数指定具体的地址

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来编译一下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11517535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存