众所周知,我们可以在NASM中使用方括号读取地址的值,例如:
mov esi, [ebp +8]
mov edi, [var] --> (var is a variable)
方括号中的那些值表示偏移地址,但是当我们使用该格式读取值时,我们绝对需要一个段,无论我们处于实际模式还是受保护模式,那么NASM使用的默认段寄存器是什么?我知道Windows使用平面模式,但如果我为不同的段寄存器(cs,ss,ds,es,fs,gs)设置不同的值,NASM会使用哪个段寄存器?我猜是ds
,对吧?在方括号中使用不同的表达式时,段寄存器是否不同?在实际模式和保护模式下,默认段注册是否相同?感谢。
答案 0 :(得分: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:
这不是汇编程序的属性,而是处理程序的属性。要覆盖它,在指令之前有一个字节段覆盖前缀。