mov指令奇怪的目标操作数

时间:2014-07-26 13:20:14

标签: memory assembly x86 cpu bootloader

我正在尝试理解Pintos引导加载程序的代码,并且某些内容令我感到奇怪。

addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000 这一行应该将头文件中定义的变量init_ram_pages中的4K页数设置为:
extern uint32_t init_ram_pages;

我不明白为什么我们从init_ram_pages这些值中减去?在mov

的目标操作数中进行减法运算意味着什么

有关详细信息:

在%eax中设置ram大小(以4K页为单位)的代码如下: (如果我的理解是正确的)

    movb $0x88, %ah
    int $0x15
    addl $1024, %eax    # Total kB memory
    cmp $0x10000, %eax  # Cap at 64 MB
    jbe 1f
    mov $0x10000, %eax
1:  shrl $2, %eax       # (shift right by two = divide by 4)
                # now eax contains the number of 4K pages I guess?

常量定义为:

/* Kernel virtual address at which all physical memory is mapped.
   Must be aligned on a 4 MB boundary. */
#define LOADER_PHYS_BASE 0xc0000000     /* 3 GB. */

修改
变量本身在同一个文件中定义如下:(在.code32后面的文件部分)

#### Physical memory size in 4 kB pages.  This is exported to the rest
#### of the kernel.d
.globl init_ram_pages
init_ram_pages:
    .long 0

1 个答案:

答案 0 :(得分:2)

减法没什么特别的,它只是一个简单的装配或链接时间操作。在最后的二进制文件中,将显示计算结果。

我认为这是引导加载程序的实模式部分,但仍使用受保护模式内存映射进行汇编/链接。调整可能会在汇编程序生成代码的保护模式地址和运行此代码时cpu实际使用的实模式地址之间进行转换。