Assembly 大会发言

Assembly 大会发言,assembly,nasm,bios,Assembly,Nasm,Bios,我目前正在编写一个教程,演示如何从头开始构建操作系统 在本教程的某些部分中,有一些汇编代码演示了寻址 代码只是尝试用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

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

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

代码只是尝试用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”

任何帮助都将不胜感激

谢谢

使用tasm而不是nasm
从理论上讲,它会起作用

你需要理解片段,才能理解为什么一个或另一个可以打印X或不打印X

我不会逐案解释一切。相反,我会给你们留下一些事实,一些困惑和一些讨论

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

假设在这两种情况下(无论是
7C0h
还是
0
),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'
...

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

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

  • CS=0
    DS=7C0h
    -访问
    X
    的一些方法将起作用
  • CS=7C0h
    DS=0
    -访问
    X
    的其他一些方法也会起作用
  • CS=0
    DS≠7C0h
    -任何访问
    X
    的方法都不起作用
  • CS=7C0h
    DS≠0
    -访问
    X
    的任何方法都不起作用

@AntoineMathys我专注于这个问题,关于为什么。不过,修复程序是正确的,第二种情况也会随之发生。
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'
...