現在、独自のブートローダーを構築しようとしていますが、奇妙なことに気付きました。
以下のコードが、マークされた NOP コマンドを使用せずに NASM または Yasm でアセンブルされると、次の CALL がバイナリから欠落します。NOP が含まれていると、CALL は正しくアセンブルされますが、op コード 0x90 (NOP) はバイナリに存在しません (NOP の性質により、後で理解できます)。
to_hex_ascii:
add al, '0'
cmp al, 0x3a
jl .end
; add al, 0x07
add al, 0x27
.end:
ret
print_word_hex:
push bp
mov bp, sp
mov dx, [bp + 4]
push dx
mov al, dh
push ax ;\
nop ; | <- NOP in question
call print_lsb_hex ; print_lsb_hex(ax);
add sp, 2 ;/
pop dx
jmp print_lsb_hex.continue
print_lsb_hex:
push bp
mov bp, sp
mov dl, [bp + 4]
.continue:
mov ah, 0x0e
; 0xf0
mov al, dl
and al, 0xf0
shr al, 4
call to_hex_ascii
int 0x10 ; BIOS print call
; 0x0f
mov al, dl
and al, 0x0f
call to_hex_ascii
int 0x10 ; BIOS print call
pop bp
ret