我正在研究Linux源代码,以了解它是如何获取内存映射的。我认为它首先调用detect_memory()来定义here。此函数调用detect_memory_e820()
,该detect_memory_e820()
在同一文件中定义。第48行intcall
调用 .code16gcc
.text
.globl intcall
.type intcall, @function
intcall:
/* Self-modify the INT instruction. Ugly, but works. */
cmpb %al, 3f
je 1f
movb %al, 3f
jmp 1f /* Synchronize pipeline */
1:
/* Save state */
pushfl
pushw %fs
pushw %gs
pushal
/* Copy input state to stack frame */
subw $44, %sp
movw %dx, %si
movw %sp, %di
movw $11, %cx
rep; movsd
/* Pop full state from the stack */
popal
popw %gs
popw %fs
popw %es
popw %ds
popfl
/* Actual INT */
.byte 0xcd /* INT opcode */
3: .byte 0
/* Push full state to the stack */
pushfl
pushw %ds
pushw %es
pushw %fs
pushw %gs
pushal
/* Re-establish C environment invariants */
cld
movzwl %sp, %esp
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
/* Copy output state from stack frame */
movw 68(%esp), %di /* Original %cx == 3rd argument */
andw %di, %di
jz 4f
movw %sp, %si
movw $11, %cx
rep; movsd
4: addw $44, %sp
/* Restore state and return */
popal
popw %gs
popw %fs
popfl
retl
.size intcall, .-intcall
,其定义如下:
movw %dx, %si
我的问题是我无法弄清楚此时dx寄存器的值是什么:{{1}}以及来自何处。
答案 0 :(得分:4)
请注意,makefile指定-mregparm=3
用于编译16位C代码。这指示编译器将前3个参数放入寄存器eax
,edx
和ecx
中。因此dx
的值将成为第二个参数&iregs
。另请注意下面的评论确认:/* Original %cx == 3rd argument */
我发现你在开始时没有问题,关于al
如何得到中断号的值,这很有趣:)