Assembly 大会发言
我目前正在编写一个教程,演示如何从头开始构建操作系统 在本教程的某些部分中,有一些汇编代码演示了寻址 代码只是尝试用4种不同的方式打印“X” 本教程声称,只有最后两种方法可以成功打印“X” 当我在我的机器上尝试时,只有第三次尝试成功 代码如下: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
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
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'
...