mov指令奇怪的目标操作数

芬戈芬

我正在尝试了解Pintos引导加载程序的代码,并且在某些行中令我感到奇怪的是。

addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000 此行应该将4K页数放入标头文件中定义的变量init_ram_pages中,如下所示:
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
小丑

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mov.b指令中的负操作数

来自分类Dev

PADDD指令的操作数

来自分类Dev

“mov”的操作数类型不匹配

来自分类Dev

mv:缺少目标文件操作数

来自分类Dev

PIN:识别MOV和间接内存操作数

来自分类Dev

错误a2070无效的指令操作数

来自分类Dev

如果操作数超过127,则CMP指令运行异常?

来自分类Dev

错误A2070:无效的指令操作数

来自分类Dev

MOVXZ进入寄存器-“指令的无效操作数”

来自分类Dev

*在指令操作数,GNU汇编,AMD64之前

来自分类Dev

YASM:指令 movsx 拒绝操作数大小的双字?

来自分类Dev

cp时缺少目标文件操作数

来自分类Dev

JavaScript操作数

来自分类Dev

gcc内联汇编错误“ mov的操作数类型不匹配”

来自分类Dev

gcc内联汇编错误“ mov的操作数类型不匹配”

来自分类Dev

构建Linux Kernel 2.6.10时出错,错误:“ mov”的操作数类型不匹配

来自分类Dev

操作数堆栈不足

来自分类Dev

左移“双”操作数

来自分类Dev

操作数中无效的“ in”

来自分类Dev

什么是操作数堆栈?

来自分类Dev

所需的最少操作数

来自分类Dev

Verilog中的操作数

来自分类Dev

错误的操作数类型

来自分类Dev

错误的操作数类型

来自分类Dev

无效的“ in”操作数n

来自分类Dev

操作数类型错误

来自分类Dev

操作数据框

来自分类Dev

x86汇编极端新手查询:“无效的指令操作数”?

来自分类Dev

bts,btr,btc指令对于指定的内存操作数是原子的吗?