Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用早期BIOS调用?(后续行动)_Assembly_X86_Reverse Engineering_Bios - Fatal编程技术网

Assembly 如何使用早期BIOS调用?(后续行动)

Assembly 如何使用早期BIOS调用?(后续行动),assembly,x86,reverse-engineering,bios,Assembly,X86,Reverse Engineering,Bios,这是一个后续,相同的ROM文件,相同的设置 多亏了Brendan,我知道在冷启动时,会进行所讨论的跳转,并且会跳过调用指令。但不久之后还有其他的内存写入。这是一个简短的列表,包含所有完整分支(55行)的完整内容可在以下位置找到: [开头与第一个问题相同] f000:e045输出0x70,al;CMOS控制器:禁用NMI,设置索引0xf f000:e047输出0xeb,al;这个端口可能没有被占用:只是一个延迟机制 f000:e049在铝中,0x71;读取0xf(CMOS关机状态) f000:e0

这是一个后续,相同的ROM文件,相同的设置

多亏了Brendan,我知道在冷启动时,会进行所讨论的跳转,并且会跳过调用指令。但不久之后还有其他的内存写入。这是一个简短的列表,包含所有完整分支(55行)的完整内容可在以下位置找到:

[开头与第一个问题相同]
f000:e045输出0x70,al;CMOS控制器:禁用NMI,设置索引0xf
f000:e047输出0xeb,al;这个端口可能没有被占用:只是一个延迟机制
f000:e049在铝中,0x71;读取0xf(CMOS关机状态)
f000:e04b输出0xeb,al;更多延迟
f000:e04d或al,al
f000:e04f jmp 0xf483
f000:f483 jne 0xf488
[假定身份≥ 0x0D(冷启动)–跳转:]
f000:f488 mov ax,0x40
f000:f48b移动设备,ax
f000:f48d cmp字es:[0x72],0x1234
f000:f494 je 0xf49b
[场景1:我们在0040:0072处找到单词0x1234:]
[一些进一步的测试,如果条件失败,总是跳到f000:f4c8;如果全部通过,则流线性地到达该地址]
[场景2:0040:0072不返回0x1234:]
f000:f496 jmp 0x3253
f000:3253 jmp 0xf499
f000:f499 jmp 0xf4c8

[所有案例现在都集中在这里]Coreboot人员告诉我,机器要么在启动时启动,要么在启动时设置“缓存为RAM”机制,其中CPU缓存用作RAM。这是通过禁用缓存写回而不禁用缓存来实现的。@fuz有趣!我将尝试在这方面做一些研究。奇怪的是,我没有看到任何可以初始化这个的东西,但也许它在某种程度上是隐式的。在这方面可能很有趣。MB使用了桥结构(北桥和南桥)。NB是Intel 82845GE(G)MCH(图形和内存控制器集线器),其职责是引导对以下之一的访问:内存、AGP(外部视频卡)、集成视频卡或ICH4(南桥)。由于它是一个预多通道、预超过4GiB的MCH,配置寄存器是有限的,默认情况下,
DRB[0:3]
regs被配置为路由32MiB的RAM。但这还不够,尤其是DRAM定时默认值无效。所以我认为RAM还没有被访问,CRAM(缓存为RAM)也是如此,它必须是。。。。。。通过调整
cr0
进行设置。在我看来,对BDA软重置标志(
0040:0072
)的读取被简单地终止(由MCH或ICH4终止),并返回
0xffff
。请记住:即使DRAM尚未初始化,也不禁止读取内存(当然,读取不会进入DRAM)。有趣、无关、事实:因为Haswell
0xfffffff0
(别名为
0xf000:fff0
)不再是引导入口点。引导是微代码,以达到适合和加载启动ACM在一个安全的环境(包括CRAM)。这是英特尔TXT(引导程序)的一部分。
[Beginning is the same as in the first question]
f000:e045  out 0x70, al  ; CMOS controller: disable NMI, set index 0xf
f000:e047  out 0xeb, al  ; this port is presumably unoccupied: just a delay mechanism
f000:e049  in al, 0x71   ; read 0xf (CMOS Shutdown Status)
f000:e04b  out 0xeb, al  ; more delay
f000:e04d  or al, al
f000:e04f  jmp 0xf483
f000:f483  jne 0xf488
[assuming status ≥ 0x0D (cold boot) – jump:]
f000:f488  mov ax, 0x40
f000:f48b  mov es, ax
f000:f48d  cmp word es:[0x72], 0x1234
f000:f494  je 0xf49b

[Scenario 1: we find word 0x1234 at 0040:0072:]
[some further tests, always jumping to f000:f4c8 if a condition fails; if all passes, the flow reaches that address linearly]

[Scenario 2: 0040:0072 does not return 0x1234:]
f000:f496  jmp 0x3253
f000:3253  jmp 0xf499
f000:f499  jmp 0xf4c8

[All cases now converge HERE]    <<<   This is the interesting bit
f000:f4c8  mov ax, 0x30
f000:f4cb  mov ss, ax
f000:f4cd  mov sp, 0x100
f000:f4d0  mov al, 0x8f
f000:f4d2  call 0xe415  ; Hi again, now I'm unconditional