相关疑难解决方法(0)

21
推荐指数
2
解决办法
2万
查看次数

[ebp*2]是否引用DS或SS段?

IDM表示,如果EBP用作基址寄存器,则内存操作使用SS段.其结果是,[ebp + esi][esi + ebp]引用SS和DS的段,分别.参见NASM的文档:3.3有效地址.

另外,在上述相同的部分,NASM提到如何通过替换以产生更短的机器代码[eax*2][eax+eax].

然而,NASM还生成[ebp + ebp]用于[ebp*2](即没有碱寄存器).

我怀疑[ebp+ebp]引用SS段,并[ebp*2]引用DS段.

我问NASM这个问题.他们思考[ebp*2]并且[ebp+ebp]是一样的,但对我来说没有意义.显然,[ebp+ebp](ebp作为基址寄存器)引用SS段.如果它们相同,也[ebp*2必须参考SS.这意味着SS只要ebp是基数或索引寄存器就被引用,这又意味着SS [ebp + esi][esi + ebp]引用SS段,因此它们必须相同.

有谁知道哪个部分[ebp*2]使用?

x86 assembly nasm opcode instructions

14
推荐指数
1
解决办法
383
查看次数

实模式内存寻址中的段和偏移量是多少?

我正在读关于内存寻址的内容.我读了关于段偏移然后关于描述符偏移的内容.我知道如何计算实模式下的确切地址.这一切都没问题,但我无法理解究竟是什么偏移?到处都读到:

在实模式下,寄存器只有16位,因此最多只能寻址64k.为了允许寻址更多内存,地址קד是从segment*16 + offset计算的.

在这里我可以理解第一行.我们有16位,所以我们可以解决最多2 ^ 16 = 64k.

但这第二行是什么?细分代表什么?为什么我们将它乘以16?为什么我们添加偏移.我只是无法理解这个偏移是什么?有人可以解释我或给我链接吗?

memory x86 assembly operating-system real-mode

12
推荐指数
2
解决办法
1万
查看次数

是否可以在实模式下使用32位寄存器/指令?

在研究一些简单的os源代码时,我对一个简单的汇编问题感到困惑.

在这个网站:http://wiki.osdev.org/Babystep7下面的代码是从实模式切换到保护模式

mov  eax, cr0
or al,1
mov  cr0, eax
Run Code Online (Sandbox Code Playgroud)

我知道如何从实模式切换到保护模式.
但我的问题是,由于程序仍处于实模式,它如何使用32位寄存器或指令?

是否可以在实模式下使用32位寄存器/指令?

x86 assembly operating-system real-mode

9
推荐指数
1
解决办法
4347
查看次数

什么是细分以及如何在8086模式下解决这些问题?

自从我开始使用8086汇编语言编程以来,我一直在思考这些段和段寄存器.我面临的问题是,我无法看到我脑海中存在哪些细分的视觉图像,因此这些概念对我来说并不清楚.


  • 任何人都可以帮助我理解将其与现实世界场景相关联的概念吗?我还有以下问题:

问题1:

据我所知,在启用了20地址线的16位实模式下,我们可以将物理内存分成16段,每段64KiB.第一部分开始于0x00000.下一段的起始地址是什么.是否会添加0x10000(65536 = 64KiB)?

问题2:

这个问题有点奇怪,但仍然是我唯一的选择.假设我给了一个偏移地址0x6000,我怎样才能找到它所属的段以便解决它.

谢谢

x86 assembly operating-system kernel x86-16

1
推荐指数
2
解决办法
1291
查看次数