学习笔记-汇编语言中的assume

以下仅为个人理解

最近在看汇编语言相关的书籍,其中作者的程序中多次用到了assume伪指令,伪指令就是告诉编译器如何编译的,而assume语句应该是和最后的链接过程有关

代码

assume cs:code ds:data ss:stack
data segment
...
data ends
stack segment
...
stack ends
code segment
start:
...
code ends
end start

data,stack和code这三个相当于目标文件的输入段,而cs,ds和ss相当于可执行文件的输出段,在最后的链接过程中链接器将要重定位cs,ds和ss段,所以将输入段的地址也重定位了,这样的话data,stack和code段实际上并不是连续存放在内存空间的,而是分段存储的,就像data和stack的地址放在.data段(通常放在ram中),而code段的地址放在.text段(通常放在rom中),而在汇编源程序中的code段中的指令部分引用data符号就可以直接确定data段的地址(将data所对应的地址直接移到ds寄存器中),所以就可以对data段所对应的数据进行操作,只需要引用data这个表示开始数据地址的符号,而不需要知道链接脚本在重定位后的data所对应的真实地址

加载该rom的过程
因为该rom最终是被链接脚本生成可执行文件的,所以在rom头中就会包含一些信息,这些信息会是将data段和stack段放在哪段VMA中(通常放在ram中),而将code段又放在哪段VMA中(通常就放在该rom在计算机上的实际地址中,不用再映射到其他的地址去),然后前一个程序将CS:IP指向该rom入口函数的地址,CPU交给该rom,指令开始运行,如果要进行数据存取的话,虽然在源程序中使用的符号表示,但在最后的链接过程中实际上已经转换成的真实的地址,所以符号已经被链接脚本全部解析了,并且将解析的信息放在了rom头,以方便上一个应用程序去加载rom头进行地址映射(因为rom只能读,所以需要将rom中的变量映射到ram中以便进行计算)

附:start解释
start应该是提示链接器在最后指定该rom的入口函数的地址,start只是一个符号,符号所对应的地址就是入口函数的地址,在链接脚本中就相当于 ENTRY(start)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值