汇编assume

引用自浙江大学白洪欢老师的解释。

assume只是对编译器编译程序起作用,并不能对段寄存器进行实际的赋值。
assume的目的是为了在编译时确定变量的段地址。
比如你在data段里定义了一个变量叫abc,然后你在
code段里引用了此变量,比如:
mov ah, [abc] 或者 mov ah, abc
那么在编译的时候,编译器首先计算出abc的偏移地址假定为0,
然后还要确定abc的段地址data与哪个段寄存器对应。如果你
assume ds:data,那么,编译出来的结果是:
mov ah, ds:[0000]
如果你assume es:data,那么编译出来的结果是:
mov ah, es:[0000]
如果你assume ds:data, es:data,这里就有个优先的问题,
ds的优先级高于es,所以编译出来的结果仍旧是:
mov ah, ds:[0000]

 

assume不对段寄存器进行赋值的,只是帮助编译器确定变量的段地址。假定变量abc的偏移地址是0,段地址是data,那么在编译
  mov ah, [abc]
这句话时,变量名abc肯定要被替换成实际的段地址及偏移地址
  mov ah, data:[0000]
但是,我们知道,段地址data本身不能用来表示指令中的段地址,必须用一个段寄存器来代替才行。所以,此时编译器需要选择ds、es、ss、cs中
的其中一个来代替data。它的选择决定于你是怎么assume的,而完全不管程序执行的时候这些段寄存器的值是否等于data(事实上编译的时候程序还没有
运行,编译器怎么可能知道4个段寄存器的值?)。

因此,把
  mov ah, [abc]
编译成
  mov ah, ds:[0000]
是因为你前面assume ds:data。如果你没有assume的话,编译会出错,因为变量所在段虽然是data,但是它不知道该用哪个段寄存器来代替data。这是出错

的主要原因。注意这里编译出来的
mov ah, ds:[0000]
中,ds这个段寄存器的值本身不会自动
被赋值为data的。

========================================以下为个人补充============================================================

但是如果你在使用[abc]时,都手动指定ds:[abc],并且你在程序的一开始就把data的地址赋值给ds的话,也是可以的。例如:

data segment
    char db 'a'
data ends
code segment
assume cs:code
main:
   mov ax, data
   mov ds, ax
   mov ah, ds:[char]
   mov ah, 4ch
   int 21h
code ends
end main

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值