【问题标题】:What was CS register's value at boot time?引导时 CS 寄存器的值是多少?
【发布时间】:2019-03-05 01:48:13
【问题描述】:

我是汇编语言的新手。这些天我用 bochs 来模拟从虚拟软盘启动的过程。但我不知道的一件事是系统初始化时CS 寄存器的值是什么。

;;  init registers

org 0x7c00

BaseOfStack equ 0x7c00

Label_Start:

mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack

;; clear screen

mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184h
int 10h

上面的代码只是其中的一部分。执行ORG 命令时,mov ax, cs 指令处的CS 寄存器值是多少。和0x7c00一样吗?谢谢。

下面是bochsrc的配置:

romimage: file="$BXSHARE/BIOS-bochs-latest"
vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="myboot.img", status=inserted
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=15
cpu: ips=15000000
log: bochsout.txt
mouse: enabled=0
megs: 32

【问题讨论】:

  • 这取决于您的 BIOS 是否将 CS=0 或 IP=0 设置为非零 CS,或其他。您可能不需要关心,只要您通过已知的段库访问数据(不是代码)。
  • 据我所知,您的 BOCHS 创建了一个名为“bochsout.txt”的日志文件。在那里您会找到一个条目“从 0000:7c00 启动”。这是启动引导扇区时的CS:IP,即您的代码。所以,CS 的值为 0x0000。
  • org 是汇编指令,而不是命令。它将影响汇编器如何计算代码中进一步使用的标签的偏移量,因此它是汇编器的命令,但不是二进制引导加载程序的一部分。

标签: assembly x86-16 boot bios bochs


【解决方案1】:

规范说在启动时CS:IP = 0000:7C00,但一些 BIOS 供应商改为启动 07C0:0000。最好的方法是编写您的引导扇区,以便通过尽早跳转到已知选择器来使其同时适用于这两种约定:

    org 0x7c00

    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00
    jmp 0x0000:set_cs

set_cs:
    ...

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2019-08-25
    • 2012-02-26
    • 1970-01-01
    • 2021-08-27
    • 2012-05-22
    相关资源
    最近更新 更多