【问题标题】:Is it possible to use segment registers to in an assigment?是否可以在分配中使用段寄存器?
【发布时间】:2021-12-27 14:20:13
【问题描述】:

我有以下代码(在 16 位实模式下使用 nasm 工作):


mov bx , 0x0          ;; use es(egmen) register 
mov es , bx           ;; to mov a value in al
mov al , es:0x48      ;; and print 
int 0x10

mov al , 0x48         ;; shouldn't this print 
int 0x10              ;; the same as above ?
  

据我所知 es:0x48 (es=0x0) 应该计算为 0x48。 所以 al 寄存器必须包含那个值,尽管它没有。为什么会这样?

【问题讨论】:

  • 奇怪的是,NASM 允许内存地址使用类似 MASM 的语法,打破了内存操作数 总是 周围有 [] 的通常 NASM 规则。用ndisasm -b16 foo.bin反汇编你会看到26A04800 mov al,[es:0x48]

标签: assembly x86-16 memory-segmentation


【解决方案1】:

是的,这是可能的,但它并没有像你想象的那样做。

说明

mov al, es:0x48

从地址es:0x48 加载一个字节到al。这只会将0x48 加载到al,如果地址es:0x48 处的字节包含0x48

x86 指令集没有计算线性地址的指令。甚至像

lea ax, es:0x48

无论es 持有什么,只会给你0x48(即段的偏移量)。

【讨论】:

  • 好的,这对我有用!非常感谢!
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2011-03-02
  • 2017-08-01
  • 2019-09-11
  • 1970-01-01
  • 2013-06-24
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多