1

众所周知,我们可以在 NASM 中使用方括号来读取地址的值,例如:

mov esi,  [ebp +8]
mov edi, [var]   -->  (var is a variable)

方括号中的值表示偏移地址,但是当我们使用该格式读取值时,我们绝对需要一个段,无论我们处于实模式还是受保护模式,那么 NASM 使用的默认段寄存器是什么?我知道 Windows 使用平面模式,但如果我为不同的段寄存器(cs、ss、ds、es、fs、gs)设置不同的值,NASM 将使用哪个段寄存器?我想是ds吧?在方括号中使用不同的表达式时,段寄存器是否不同?实模式和保护模式下的默认段寄存器是否相同?谢谢。

4

1 回答 1

5

对于所有“基址寄存器”,默认段寄存器是 ds,除了

 mov esi, [ebp + 542] ; // uses ss:
 mov esi, [esp + 123] ; // uses ss: too
 mov eax, [eax + esp] ; // uses ds, because eax is the base 
                        // and esp is the scalable register (with scale==1)

 stosb   ;; uses es:

这不是汇编程序的属性,而是处理器的属性。要覆盖它,在指令之前有一个字节段覆盖前缀。

于 2013-02-12T06:59:17.873 回答