OS(3) IPL開始時のスタックはどこ?
この前は IPL 開始時点での cs:ip を確認したが、ss:sp はどうなんだろ?と思って作ったIPLがこれ。
実行例はVirtualPC2004のもの。これだとIPLより下位側のメモリにあるので、IPLがつぶされることはないですね。
IPLソース
; 開始時点の cs:ip, ss:sp 表示 [org 0x7c00] start: call next next: mov ax, cs mov ds, ax cld ; 実行開始時点の cs:ip 表示 mov si, msg_start call puts mov ax, cs ; CS call put_AX mov al, ':' call putc pop ax ; IP sub ax, next - start call put_AX call put_CRLF ; 実行開始時点の ss:sp 表示 mov si, msg_stack call puts mov ax, ss ; SS call put_AX mov al, ':' call putc mov ax, sp ; SP call put_AX call put_CRLF jmp $ msg_start: db 'cs:ip = ', 0 msg_stack: db 'ss:sp = ', 0 ;======================================================================================== put_CRLF: push ax mov al, 13 call putc mov al, 10 call putc pop ax ret ; Video BIOSを利用したASCIZ文字列出力 puts: lodsb or al, al jz .@ret call putc jmp puts .@ret: ret ; 空白を出力 put_SPC: push ax mov al, ' ' call putc pop ax ret ; ; Video BIOSを利用した1文字出力 putc: push bx mov ah, 0x0e mov bx, 7 ; 白 int 0x10 pop bx ret ; ; AXレジスタを16進4桁で出力 put_AX: push ax push cx mov cx, 4 .@loop: rol ax, 4 push ax and al, 0x0f ; 4ビットを取り出し add al, '0' cmp al, '9' jbe .@disp add al, 'A' - '9' - 1 .@disp: call putc pop ax loop .@loop pop cx pop ax ret ; times 510 - ($ - $$) db 0 dw 0xaa55