【问题标题】:Addressing in Assembly在汇编中寻址
【发布时间】:2013-04-20 23:33:23
【问题描述】:

我目前正在编写一个演示如何从头开始构建操作系统的教程。

在教程的某些部分中,有一些汇编代码演示了寻址。

代码只是尝试以 4 种不同的方式打印“X”。

本教程声称只有最后两种方法可以成功打印“X”。

当我在我的机器上尝试时,只有第三次尝试成功

代码如下:

mov ah,0x0e

;first attempt
mov al,the_secret
int 0x10

;second attempt
mov al,[the_secret]
int 0x10

;third attempt
mov bx,the_secret
add bx,0x7c00      ; 0x7c00 is where bios loads our boot sector code
mov al,[bx]
int 0x10


;fourth attempt
mov al,[0x7c1e] 
int 0x10

jmp $

the_secret:
    db "X"

times 510 -( $ - $$ ) db 0
dw 0xaa55

现在,我明白为什么前两次尝试失败了。

我相信最后两次尝试应该打印 X

那么为什么第四次尝试打印'X'失败?

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: assembly nasm bios


    【解决方案1】:

    您需要了解段以了解为什么一个或另一个可能会或可能不会打印 X。

    我不会逐案解释所有事情。相反,我会给你一些事实、一些拆解和一些讨论。

    首先,BIOS 可以使用CS=7C0hIP=0CS=0IP=7C00h 启动您的引导扇区。两者都指向同一个物理地址:7C0h * 16 + 0 = 0 * 16 + 7C00h = 7C00h

    暂时假设在这两种情况下DS=CS(无论是7C0h0),CPU 将拥有引导扇区的同一机器代码的这两种不同视图之一:

    IP        instruction bytes instruction
    00000000  B40E              mov ah,0xe
    00000002  B01E              mov al,0x1e
    00000004  CD10              int 0x10
    00000006  A01E00            mov al,[0x1e]
    00000009  CD10              int 0x10
    0000000B  BB1E00            mov bx,0x1e
    0000000E  81C3007C          add bx,0x7c00
    00000012  8A07              mov al,[bx]
    00000014  CD10              int 0x10
    00000016  A01E7C            mov al,[0x7c1e]
    00000019  CD10              int 0x10
    0000001B  E9FDFF            jmp word 0x1b
    0000001E  58                pop ax        ; this is your 'X'
    ...
    

    IP        instruction bytes instruction
    00007C00  B40E              mov ah,0xe
    00007C02  B01E              mov al,0x1e
    00007C04  CD10              int 0x10
    00007C06  A01E00            mov al,[0x1e]
    00007C09  CD10              int 0x10
    00007C0B  BB1E00            mov bx,0x1e
    00007C0E  81C3007C          add bx,0x7c00
    00007C12  8A07              mov al,[bx]
    00007C14  CD10              int 0x10
    00007C16  A01E7C            mov al,[0x7c1e]
    00007C19  CD10              int 0x10
    00007C1B  E9FDFF            jmp word 0x7c1b
    00007C1E  58                pop ax          ; this is your 'X'
    ...
    

    您现在可以清楚地看到为什么某些访问“X”的方法应该在一种情况下工作,而在另一种情况下不应该工作,反之亦然。

    现在,由于 BIOS 不保证在您的引导扇区开始执行时 DS 中的任何特定值,您可能有 DS≠CS,这里有四种可能的情况:

    • CS=0DS=7C0h - 一些访问X 的方法将起作用
    • CS=7C0hDS=0 - 其他一些访问 X 的方法也可以使用
    • CS=0DS≠7C0h - 访问 X 的方法都不起作用
    • CS=7C0hDS≠0 - 访问 X 的方法都不起作用

    【讨论】:

    • @AntoineMathys 我专注于这个问题,为什么。不过,修复是正确的,并且第二种情况将起作用。
    【解决方案2】:

    使用 tasm 代替 nasm 理论上是可以的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多