注册 登录
编程论坛 汇编论坛

关于nasm生成纯二进制汇编文件的段访问问题

bailichangqi 发布于 2013-09-11 23:08, 728 次点击
各位前辈好,小弟最近在看于渊的《一个操作系统的实现》这本书,从一个磁盘引导程序开始的   

以前看过一些汇编的书籍   但是都是跟dos相关的汇编,在处理段地址的时候都有很多指令  比如 seg获取段基址等等
但是现在nasm提示生成的纯二进制文件不支持段引用   那么  
1.我如何该确定自己写的代码某个段的段基址是多少呢?
2.现在似乎$操作符仍然有用  这个操作副现在还是表示当前处距离段基址的距离吗
3.当我在程序中使用了一个label加入有如下片段
mylabel:
mov ax,ax
...
mov ax,mylabel
此时放入ax中的值是什么呢?   是在内存中的绝对地址  如果是的话  这个值是多少位的呢?
脑子很乱   希望有前辈高人能不吝赐教!  非常感谢
4 回复
#2
xkwy00002013-09-12 09:39
在dos下,一个应用程序被加载后可以自己重新定位,展开,而脱离系统的管理,很有趣
#3
bailichangqi2013-09-12 12:29
回复 2楼 xkwy0000
您好,我现在很困惑的是纯二进制的汇编下面的一些问题  看到有说Label的值会被编译器转换成相对于程序开头的偏移值 是这样吗?  如果是的话 那么这个值有多大呢  是32位的  还是16位的呀如果不是这样  我该怎么确定另一个段的值呢
不考虑保护模式  就只论实模式   内存中的一个位置可以有多种段值+偏移的表示 比如我有以下代码
mov ax,ax
...
...   <--这是一段很长很长的代码或者数据段的定义  超过了一个段的最大长度
...
mov bx,bx
当我在执行完mov ax,ax之后想跳到下面的mov bx,bx去  我该如何去确定mov bx,bx的段值+偏移地址呢    难道说要我自己手算吗
问题有点长,很不好意思,希望您能不吝赐教
我现在使用的是nasm编译器
#4
xkwy00002013-09-12 19:08
对于编译器nasm,没有使用过,如果说受到编译器的限制,不大好办,得需要修改nasm
在masm下,label很好用的
64k的空间,程序段足够用了,有必要的话,像windows那样大的程序,采取些措施也可以吧,把数据段单列出去,也就是分段,就可以避免
可能我说的不是你想说的问题
#5
xkwy00002013-09-12 20:08
在masm下:
   mov ax,ax
   call 标号名
   ------
   ------
   。。。。
   标号名  label  FAR
   mov bx,bx
   ------
   RETF
1