立即数和位移

lezi1022 2003-05-27 10:51:42
dseg segment
data db 10 dup(?)
dseg ends
cseg segment
assume cs:cseg,ds:dseg
start:mov ax,dseg
mov ds,ax
mov al,01h
mov data,al
mov dl,data

为什么说“从汇编整体来看,dseg是立即数,data是位移"?
dseg不是数据段的基址吗?怎么变成立即数了?data不是一个变量吗?怎么变成位移了?
为什么要把数据段装载,而代码段不装载?
...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragonheros 2003-05-28
  • 打赏
  • 举报
回复
代码中很明确,mov ax,dseg 这里就说明dseg是立即数。data是一个变量,但是编译器要先给数据段等做初始化操作,所以要将data认为是地址,而它不是段地址,所以是位移。至于代码段的问题,则是程序总要开始的,所以一定有固定的运行开始位置,可能在文件头中找的到,可能就是CS:100,当然数据段是不可以自动装入,因为程序里可能没有数据段的吧
W32API 2003-05-28
  • 打赏
  • 举报
回复
在 INTEL 编码中,立即数是指令的一个部分,也就是说,标号等都是由编译器转换为内存地址,你可以在 DEBUG 下面看到,跳转指令没有标号,都是跳转到内存地址
dunkel 2003-05-28
  • 打赏
  • 举报
回复
>> 回复人: yinjintao(随机恋爱过程)(变态分布)
>> to dunkel(内心和夜 哪个黑) 书上好象说堆栈段也要装入啊
这个主要看堆栈段是如何定义的. 如果在堆栈段的定义中指明了 STACK 属性, 则最后生产的.exe中SS:SP就指向了所定义的堆栈段, 用户自己的代码可以不再进行指定. 如果堆栈段的定义中没有指明 STACK 属性, 这才需要程序自己来设定 SS:SP
nicememory 2003-05-28
  • 打赏
  • 举报
回复
to dunkel(内心和夜 哪个黑)
书上好象说堆栈段也要装入啊

立即数在代码段中
在代码段定义一个常量(立即数),看内存中的数据段,根本没有这个常量的位置
所以也没有什么地址之说了
dunkel 2003-05-27
  • 打赏
  • 举报
回复
自动设置的应该还有堆栈段 SS:SP
W32API 2003-05-27
  • 打赏
  • 举报
回复
位移即相对偏移量。 DATA 是相对于 DSEG 段的偏移量,即位移。
DSEG 是数据段的基址,其由编译器解释,可以理解为立即数。
在汇编中,操作数应为寄存器或内存地址,无所谓变量。
汇编编译器仅自动装载代码段,所以无须人为装载;
每个程序段都可以拥有多个数据段,比如:DS、FS、GS 段,所以由人为装载较好。
dunkel 2003-05-27
  • 打赏
  • 举报
回复
立即数有地址之说吗? 如果非要说有的话, 我想由于立即数是直接以数值形式存在于指令中的, 所以应该是在代码段吧?
lezi1022 2003-05-27
  • 打赏
  • 举报
回复
那立即操作数呢?
立即操作数有地址吗?
它是在代码段,还是在数据段?
W32API 2003-05-27
  • 打赏
  • 举报
回复
.com 则堆栈设置在程序内存地址空间的最后,由编译器自动设置

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧