質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

3回答

2548閲覧

アセンブリ言語 プロテクトモードで文字を表示させたい。

kazuyakazuya

総合スコア193

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2020/02/07 10:04

編集2020/02/13 11:05
環境 ・ホスト OS windows 作成したブートローダーから第二ブートローダーまで(内容はプロテクトモードへ移行してからVRAMへ書き込むまで) そのプロフラムをVirtualbox上で動かしています。 縦: 480ドット 横: 640ドット

リアルモードからプロテクトモードへ移行させて文字を表示させたかったのですが
思うようにいきません。
FONT: は16bitアドレスの範囲に設置しています。

FILE boot.s

s

1push FONT 2call get_font_adr 3add sp,2 4 5 6FONT: 7.seg: dw 0 8.off: dw 0 9 10; 11; 12;省略・・・ 13; 14; 15 16mov esi,'a' 17shl esi,4 18add esi,[FONT] 19 20mov edi,0xA_0000 21 22mov ecx,16 23 24.10L: 25 26movsb 27add edi,80 - 1 28 29loop .10L 30

FILE get_font_adr

s

1get_font_adr: 2 3push bp 4mov bp,sp 5 6;/_/_/_/_/_/_/_/ 7; 8;bx 9;ax 10;bp (bp) 11;リターンアドレス 12;フォントアドレス格納位置(si) 13; 14;/_/_/_/_/_/_/_/ 15 16push ax 17push bx 18push si 19push es 20push bp 21 22mov si,[bp + 4] 23 24mov ax,0x1130 25mov bh,0x06 ;8×16 26int 10h ;ES:BPにフォントアドレスが設定される。 27 28mov [si + 0],es ;低位アドレスに上位を格納。 29mov [si + 2],bp ;高位アドレスに下位を格納。 30 31pop bp 32pop es 33pop si 34pop bx 35pop ax 36 37mov sp,bp 38pop bp 39 40ret 41

画面左上に'a'を表示させたいのですが

イメージ説明

このように表示されてしまいます。

・まず、左上に'a'ではないけど なんか写っているので
VRAM領域への書き込み自体はうまくいっている。

・縦横連続的に写っているので改行処理はうまくいっている。

s

1add edi,80 - 1

以上のことを踏まえるとフォントアドレスを正しく受け取れていない
または
フォントアドレスを格納場所(FONT:)に入れられていない。

のどちらか(たぶん)


push FONT
call get_font_adr
add sp,2

関数 get_font_adr には引数としてFONTを

FONT: ・・・ BIOSコールで手に入れたフォントアドレス

スタックに積みます。

get_font_adr: push bp mov bp,sp ;/_/_/_/_/_/_/_/ ; ;bx ;ax ;bp (bp) ;リターンアドレス ;フォントアドレス格納位置(si) ; ;/_/_/_/_/_/_/_/ push ax push bx push si push es push bp mov si,[bp + 4] mov ax,0x1130 mov bh,0x06 ;8×16 int 10h ;ES:BPにフォントアドレスが設定される。 mov [si + 0],es ;低位アドレスに上位を格納。 mov [si + 2],bp ;高位アドレスに下位を格納。 pop bp pop es pop si pop bx pop ax mov sp,bp pop bp ret

s

1mov esi,'a' 2shl esi,4 ;1文字16バイトなので ×16をしてオフセットを求める。 3add esi,[FONT] ;ベース + オフセット これでアドレスを手に入れる。 4 5mov edi,0xA_0000 6 7mov ecx,16 ;縦16bitなので16回改行を入れる。 8 9.10L: 10 11movsb ;esiレジスタに入っているアドレスに入ってい値からediレジスタに入っているアドレスへ値を入れる。 12add edi,80 - 1 ;改行 よこ680bit 80バイト だから +79 13 14loop .10L

どこが間違えているのか見つけられないのですが
どこが間違えているのでしょうか?

###追記
自分でフォントデーターを作成し、それを映し出すことを目標にします。
メモリ:0x0000:0x0500にフォントデーターを配置させます。

s

1mov ax,0x0000 2mov [FONT.seg],ax 3mov ax,0x0500 4mov [FONT.off],ax 5

[es:bp]にフォントデータを配置するアドレスを配置しました。
es=0x0000
bp=0x0500
また、

s

1FONT: 2.seg: dw 0 3.off: dw 0 4

こっちにも
.seg=0x0000
.off=0x0500
を格納します。

s

1mov ax,0b1111111111111111 2mov [es:bp],ax 3add bp,2 4mov [es:bp],ax 5add bp,4 6mov [es:bp],ax 7add bp,6 8mov [es:bp],ax 9 10mov ax,0b0000000000000000 11add bp,8 12mov [es:bp],ax 13add bp,10 14mov [es:bp],ax 15add bp,12 16mov [es:bp],ax 17add bp,14 18mov [es:bp],ax 19

このコードで0x0000:0x0500で表させる先頭アドレスから最初の8バイトを11111・・・で埋め尽くし
最初の8バイトから16バイトまでを0000・・・で埋め尽くします。
フォントデータ 1文字16バイト。1文字 縦16ドット 横8ドット
これを表示させると
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□

このように表示されることを期待しています。
実際に、0x0000:0x0500の領域にデータが書き込まれたか確認をします。

s

1mov ax,[es:bp] 2push 0b0100;これは気にしないでください。 3push 2 ;2進数で表示させたいから基数2をプッシュ 4push 16 ;0 or 1を16文字ASCIIで表示させるから16バイト 5push .font_data2 ;font_data2にASCIIに変換した数値を格納 6push ax;変換したい数値 7call itoa;ASCII変換関数を呼び出す 8add sp,10 9 10push .font_data2 ;表示させたい文字をプッシュ(さっきASCIIに変換した数値) 11call puts ;出力関数 12add sp,19 13 14.font_data2 db "----------------",0x0A,0x0D,0 ;16バイト分 0x0A,0x0Dは画面出力させるとき改行するため 0は文字列の終わりを示す。 15

以下、ASCII変換関数

s

1itoa: 2 3;/_/_/_/_/_/_/_/_/_/_/_/ 4; 5;bp (bp) 6;リターンアドレス 7;num 変換する値 (ax) 8;buff 保存先アドレス(si) 9;size 保存先バッファさきサイズ(cx) 10;radix 基数(2、8,10または16を設定する。) 11;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx) 12; 13;/_/_/_/_/_/_/_/_/_/_/_/ 14 15push bp 16mov bp,sp 17 18push ax 19push bx 20push cx 21push dx 22push si 23push di 24 25mov ax,[bp + 4] ;変換する値 26mov si,[bp + 6] ;保存先アドレス 27 28mov cx,[bp + 8] ;cx=バッファサイズ 29 30mov di,si 31add di,cx 32dec di ;di=バッファの最後尾 33 34mov bx,word [bp + 12] ;flags 35 36test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。 37 38.10Q: 39je .10E ;IF ZF=1 40 41cmp ax,0 42 43.12Q: 44jge .12E 45or bx,0b0010 46 47.12E: 48.10E: 49 50test bx,0b0010 51 52.20Q: 53je .20E ;IF ZF==1 54cmp ax,0 55 56.22Q: 57jge .22F 58neg ax 59mov [si],byte '-' 60 61jmp .22E 62 63.22F: 64 65mov [si],byte '+' 66 67.22E: 68dec cx 69 70.20E: 71 72;/_/_/_/_/_/_/ 73;ASCII変換 74;/_/_/_/_/_/_/ 75 76mov bx,[bp + 10] ;基数 77 78.30L: 79 80mov dx,0 81div bx 82;DX=DX:AX % 基数 83;AX=DX:AX / 基数 84 85mov si,dx 86mov dl,byte [.ascii + si] 87 88mov [di],dl 89dec di 90 91cmp ax,0 ;割った商が0か確認 92 93loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0 94 95.30E: 96 97; 98;空白を埋める。 99; 100 101;cmp cx,0 102;.40Q: 103;je .40E ;IF ZF==1 104;mov al,' ' 105 106;cmp [bp + 12],word 0b0100 107 108;.42Q: 109;jne .42E ;IF ZF==0 110mov al,'0' 111 112.42E: 113std ;デクリメント 114rep stosb ;al→di ecx=回数 115 116.40E: 117 118pop di 119pop si 120pop dx 121pop cx 122pop bx 123pop ax 124 125mov sp,bp 126pop bp 127 128ret 129 130.ascii db "0123456789ABCDEF" 131

以下、出力関数

s

1puts: 2 3;/_/_/_/_/_/_/ 4; 5;bx 6;ax 7;bp←bp 8;リターンアドレス 9;文字コード 10; 11;/_/_/_/_/_/_/ 12 13push bp 14mov bp,sp 15push ax 16push bx 17push si 18 19mov si,[bp + 4] 20mov ah,0x0E ;固定 21 22mov bx,0x0000 ;固定 23 24cld ;DFを0にする。 25 26.10L: 27 28lodsb ;si=文字列 DF=0ならインクリメントする。 29cmp al,0 30je .10E ;IF ZF==1 31 32int 0x10 33 34jmp .10L 35 36.10E: 37 38pop si 39pop bx 40pop ax 41mov sp,bp 42pop bp 43 44ret 45

数値をそのまま画面に出力できないので
数値をASCIIに変換してから表示させます。
0x0000:0x0500から先頭の2バイトを表示させています。
さっきそこには1111...を格納したので
1111...が2バイト分つまり
16個 '1'が表示させるはずなのですが。。。
イメージ説明

なぜ、書き換えがうまくいっていないのでしょうか?

s

1mov ax,0b1111111111111111 2mov [0xA_0000],ax 3mov [0xA_0050],ax 4mov [0xA_00A0],ax 5mov [0xA_00F0],ax 6mov [0xA_0140],ax 7

試しに直接VRAMへ書き込みをおこなったところ
イメージ説明
書き込めさえすればしっかり写してくれているので
VRAMへデータを適切に移せていないのが
文字が出ない原因のようです。

次は、0x0_0500にフォントデータ(全部1)を設置してから
VRAMへ書き込むプログラムを書いてみました。

s

1mov ax,0b1111111111111111 2mov [0x0_0500],ax 3mov [0x0_0502],ax 4mov [0x0_0504],ax 5mov [0x0_0506],ax 6mov [0x0_0508],ax 7 8 9mov ax,[0x0_0500] 10mov [0xA_0000],ax 11mov ax,[0x0_0502] 12mov [0xA_0050],ax 13mov ax,[0x0_504] 14mov [0xA_00A0],ax 15mov ax,[0x0_506] 16mov [0xA_00F0],ax 17mov ax,[0x0_508] 18mov [0xA_0140],ax

画面には何も出力されませんでした。
なぜなんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/02/07 10:19

どういう環境でそのコードを走らせてるでしょう DOS上とかかな? VGAのVRAMがどーこーってうんじうねんまえのはなしなんで、情報出てくるやらどないやら
kazuyakazuya

2020/02/07 10:35

すみません。追記します
y_waiwai

2020/02/07 21:45

まずは、とりあえずそのフォントデータを16進出力してみて、きちんとフォントデータになってるか確認してみればどお?
kazuyakazuya

2020/02/07 22:24

あ、そうですね 数値を出力する関数をまだ作っていなかったので やってみます。
kazuyakazuya

2020/02/09 01:38

16進数で表記させたところ FF53 F000 FF53 F000 となりました。・・・ フォントデータってどこかから入手できるのでしょうか? そうしないと答え合わせができない・・・
kazuyakazuya

2020/02/09 01:52

11111111■■■■■■■■ 01010011□■□■□□■■ 11110000■■■■□□□□ 00000000□□□□□□□□ 11111111■■■■■■■■ 01010011□■□■□□■■ 11110000■■■■□□□□ 00000000□□□□□□□□
kazuyakazuya

2020/02/10 02:48

プログラムが間違っていたので訂正しました。 改めて確認したところ 先頭のフォントアドレスには 0で埋め尽くされていました。 これが画面左上が白で埋め尽くされてしまっている原因のようです。
guest

回答3

0

自己解決

簡単にFATファイルシステムを作ります。

s

1 2times (FAT1_START) - ($ - $$) db 0x00 3 4FAT1: 5db 0xFF,0xFF ;予約領域 6dw 0xFFFF;予約領域 7dw 0xFFFF 8 9FAT2: 10db 0xFF,0xFF ;予約領域 11dw 0xFF ;予約領域 12dw 0xFFFF 13 14 15FAT_ROOT: 16db 'BOOTABLE','DSK' 17db 0x28 18db 0x00 19db 0x00 20dw (0<<11)|(0<<5)|(0/2) 21dw (0<<9)|(0<<5)|( 1) 22dw (0<<9)|(0<<5)|( 1) 23dw 0x0000 24dw (0<<11)|(0<<5)|(0/2) 25dw (0<<9)|(0<<5)|( 1) 26dw 0 27dd 0 28 29db 'SPECIAL','TEXT' 30db 0x20 31db 0x00 32db 0 33dw (0<<11)|(0<<5)|(0/2) 34dw (0<<9)|(1<<5)|( 1) 35dw (0<<9)|(1<<5)|( 1) 36dw 0x0000 37dw (0<<11)|(0<<5)|(0/2) 38dw (0<<9)|(1<<5)|( 1) 39dw 2 40dd FILE.end - FILE 41 42times (FILE_DATA) - ($ - $$) db 0x00 43 44FILE: 45db 0b00000000 46db 0b00000000 47db 0b00000000 48db 0b00000000 49db 0b00000000 50db 0b01111000 51db 0b00001100 52db 0b01111100 53db 0b11001100 54db 0b11001100 55db 0b11001100 56db 0b01110110 57db 0b00000000 58db 0b00000000 59db 0b00000000 60db 0b00000000 61 62db 0b00000000 63db 0b00000000 64db 0b11100000 65db 0b1100000 66db 0b1100000 67db 0b1111000 68db 0b1101100 69db 0b1100110 70db 0b1100110 71db 0b1100110 72db 0b1100110 73db 0b1111100 74db 0b00000000 75db 0b00000000 76db 0b00000000 77db 0b00000000 78 79db 0b00000000 80db 0b00000000 81db 0b00000000 82db 0b00000000 83db 0b00000000 84db 0b1111100 85db 0b11000110 86db 0b11000000 87db 0b11000000 88db 0b11000000 89db 0b11000110 90db 0b11111000 91db 0b00000000 92db 0b00000000 93db 0b00000000 94db 0b00000000 95 96;626 97db 0b00000000 98db 0b00000000 99db 0b00011100 100db 0b00001100 101db 0b00001100 102db 0b00111100 103db 0b01101100 104db 0b11001100 105db 0b11001100 106db 0b11001100 107db 0b11001100 108db 0b1110110 109db 0b00000000 110db 0b00000000 111db 0b00000000 112db 0b00000000 113 114;627 115db 0b00000000 116db 0b00000000 117db 0b00000000 118db 0b00000000 119db 0b00000000 120db 0b1111100 121db 0b11000110 122db 0b11111110 123db 0b11000000 124db 0b11000000 125db 0b11000110 126db 0b1111100 127db 0b00000000 128db 0b00000000 129db 0b00000000 130db 0b00000000 131 132;628 133db 0b00000000 134db 0b00000000 135db 0b111000 136db 0b1101100 137db 0b1100100 138db 0b1100000 139db 0b11110000 140db 0b1100000 141db 0b1100000 142db 0b11000000 143db 0b1100000 144db 0b11110000 145db 0b00000000 146db 0b00000000 147db 0b00000000 148db 0b00000000 149 150 151;629 152db 0b00000000 153db 0b00000000 154db 0b00000000 155db 0b00000000 156db 0b00000000 157db 0b1110110 158db 0b11001100 159db 0b11001100 160db 0b11001100 161db 0b11001100 162db 0b11001100 163db 0b1100 164db 0b11001100 165db 0b11001100 166db 0b1111000 167db 0b00000000 168 169;630 170db 0b00000000 171db 0b00000000 172db 0b11100000 173db 0b1100000 174db 0b1100000 175db 0b1101100 176db 0b1110110 177db 0b1100110 178db 0b1100110 179db 0b1100110 180db 0b11100110 181db 0b00000000 182db 0b0000000 183db 0b0000000 184db 0b00000000 185db 0b00000000 186 187;631 188db 0b00000000 189db 0b00000000 190db 0b11000 191db 0b11000 192db 0b0000000 193db 0b111000 194db 0b11000 195db 0b11000 196db 0b11000 197db 0b11000 198db 0b11000 199db 0b111100 200db 0b0000000 201db 0b0000000 202db 0b00000000 203db 0b00000000 204 205 206;632 207db 0b00000000 208db 0b00000000 209db 0b110 210db 0b110 211db 0b0000000 212db 0b1110 213db 0b110 214db 0b110 215db 0b110 216db 0b110 217db 0b110 218db 0b110 219db 0b1100110 220db 0b1100110 221db 0b111100 222db 0b00000000 223 224;633 225db 0b00000000 226db 0b00000000 227db 0b11100000 228db 0b1100000 229db 0b1100000 230db 0b1100110 231db 0b1101100 232db 0b1111000 233db 0b1111000 234db 0b1101100 235db 0b1100110 236db 0b11100110 237db 0b0000000 238db 0b0000000 239db 0b0000000 240db 0b00000000 241 242;634 243db 0b00000000 244db 0b00000000 245db 0b111000 246db 0b11000 247db 0b11000 248db 0b11000 249db 0b11000 250db 0b11000 251db 0b11000 252db 0b11000 253db 0b11000 254db 0b111100 255db 0b0000000 256db 0b0000000 257db 0b0000000 258db 0b00000000 259 260;635 261db 0b00000000 262db 0b00000000 263db 0b00000000 264db 0b00000000 265db 0b00000000 266db 0b11100110 267db 0b11111111 268db 0b11011011 269db 0b11011011 270db 0b11011011 271db 0b11011011 272db 0b11011011 273db 0b0000000 274db 0b0000000 275db 0b0000000 276db 0b00000000 277 278;636 279db 0b00000000 280db 0b00000000 281db 0b00000000 282db 0b00000000 283db 0b00000000 284db 0b11011100 285db 0b1100110 286db 0b1100110 287db 0b1100110 288db 0b1100110 289db 0b1100110 290db 0b1100110 291db 0b0000000 292db 0b0000000 293db 0b0000000 294db 0b00000000 295 296 297 298.end: 299 300times (512 *2) db 0x00 301

メモリへファイルデータ(フォントデータ)を移送する。
プロテクトモードではBIOSコールを使用することができないので
いったんリアルモードへ移行してからBIOSコールを呼び出す・・・という手順を
行ったのですが
メモリへフォントデータを移送した後プロテクトモードへ戻れないという事態が発生したので
プロテクトモードでこの処理をすることは諦め、
第二ブートローダーの段階でファイルを呼び出しました。

VRAM文字列書き込み関数

s

1protect_puts: 2 3 4 5mov eax,A 6mov ebx,4 7mov [COUNT],ebx 8 9.protect_puts_loop2: 10 11mov ebx,0x01 12xor ebx,ebx 13mov ebx,[COUNT] 14cmp ebx,0 15jz .endd 16 17mov esi,[eax] 18and esi,0b00000000000000000000000011111111 19 20 21shl esi,4 22 23;mov ebx,0x0_0500 24xor ebx,ebx 25mov bx,[vram_address1_2] 26shl ebx,16 27mov bx,[vram_address1_1] 28 29;and esi,0b00000000000000001111111111111111 30add esi,ebx 31 32xor ebx,ebx 33mov bx,[vram_address2_1] 34shl ebx,16 35mov bx,[vram_address2_2] 36mov edi,ebx 37 38;mov edi,0xA_0000 39mov ecx,16 40 41 42.protect_puts_loop: ;VRAM改行させるため +80 43movsb 44add edi,80 - 1 45loop .protect_puts_loop ;VRAM改行させるため +80 46 47inc eax 48 49mov ebx,[COUNT] 50nop 51sub ebx,1 52mov [COUNT],ebx 53 54xor ebx,ebx 55mov ebx,[COUNT2] 56nop 57cmp ebx,0 58nop 59add ebx,0x01 60 61je .protect_puts_loop2 62 63 64 65 66; 67; 68; 69 70xor ebx,ebx 71 72mov bx,[vram_address2_1] 73shl ebx,16 74mov bx,[vram_address2_2] 75add ebx,0x01 76 77mov [vram_address2_2],bx 78shr ebx,16 79mov [vram_address2_1],bx 80 81; 82; 83; 84 85jmp .protect_puts_loop2 86 87 88 89 90.endd: 91 92 93ret 94 95 96COUNT: dw 0 97COUNT2: dd 0 98vram_address1_1: dw 0x0500 99vram_address1_2: dw 0x0000 100 101vram_address2_1: dw 0x000A 102vram_address2_2: dw 0x0000 103

書き忘れましたが、メモリにデータを移せない件については
Virtulboxを再インストールすることで解決できました。

投稿2020/02/23 07:50

編集2020/02/26 22:40
kazuyakazuya

総合スコア193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちなみにVirtualboxのBIOSのフォントデータ

x16のaですと[0, 0, 0, 0, 0, 120, 12, 124, 204, 204, 204, 118, 0, 0, 0, 0]ですね

00000000 00000000 00000000 00000000 00000000 01111000 00001100 01111100 11001100 11001100 11001100 01110110 00000000 00000000 00000000 00000000

投稿2020/02/12 10:03

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/02/12 10:15

回答ありがとうございます。
kazuyakazuya

2020/02/13 10:28

このフォントデータというのはどのような順番なのでしょうか?
kazuyakazuya

2020/02/19 15:18

あとフォントデータを入手できればVRAMへ文字出力ができるようになるのですが リンク先の16進数を手作業で2進数へ変換するのはちょっと厳しいので できれば2進数表記のフォントデータが欲しいです。 一応調べているのですが 「"Virtualbox" "フォントデータ"」 思うような情報が出てきません どうやって調べたら出てくるのでしょうか?
asm

2020/02/20 00:22

C言語なのですからそのままコンパイルできると思いますが?
kazuyakazuya

2020/02/20 08:26

C言語とアセンブリ言語をそのまま一緒にコンパイルできるって言う意味ですか?
asm

2020/02/20 08:52

できないとフルアセンブリでOS書くのは面倒ですし 大抵の解説で後々C言語とリンクさせているかと思います。 また、C言語のみでフォントデータを出力するプログラムを書くのも難しくはないでしょう。 あとは、提示したコードの先頭の > These fonts come from ftp://ftp.simtel.net/pub/simtelnet/msdos/screen/fntcol16.zip に注目すれば https://github.com/perillamint/dkbfnts/blob/master/fntcol16/VGA-ROM.F16 等が見つかります。
kazuyakazuya

2020/02/22 14:45

ありがとうございます。
guest

0

ちと調べてみました。
フォントパターンの取得はAH=0x18になってますね

出典:DOS/Vプログラマーズハンドブック
イメージ説明

上記はDOS/Vに実装されてるやつかな?

0x1130 のやつもありました
出典:THE IBM PC&PS/2
イメージ説明

投稿2020/02/10 08:39

編集2020/02/10 09:23
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/02/10 08:52

もしかしたらフォントアドレス取得がうまくいってないかも・・・ BIOSコールを実行すると[es:bp]にアドレスが保管される。 ①esに入っている数値をそのままASCII変換させて表示されると 0x0000 ②FONT:にいったんアドレスを保管し、そこの値を ASCII変換させて表示させると 0xC000 ためしに、オフセットbpのアドレスを .sampleに変更して mov bp,.sample .sample db 5 [es:bp]にある値を表示させたところ、5が表示されました。 つまり、②がどこかで間違えている・・・。 ご提示いただいたほうも試してみます。
y_waiwai

2020/02/10 08:58

BIOSのそこらへんのシステムコールは、機種依存のファンクションがたくさんあって、現状の(VirtualBoxの)BIOSではどれが実装されてどれがされてないかってのはよーわかりません。 提示してるのも、手元の資料で見つけたものを出してるだけなんですね。 まあ、違ってるかもしれない、というのを前提で見ていただけるとよろしいかと
y_waiwai

2020/02/10 09:23

追記しました
y_waiwai

2020/02/10 09:30

ああ、この記述だと、ビデオモードをVGAにしないと出てこないとかじゃ。。
kazuyakazuya

2020/02/10 10:24

モードはテキストモードとグラフィックモードの2つだけだと思っていたのですが さらにVGAモードと言うものがあるんですか?
y_waiwai

2020/02/10 10:36

あるんですねこれが。 ややこしいので、直接コードを実行させようとするんではなく、DOS(FreeDOSとか)を走らせた上で、その上でコードを走らせればどうでしょう。16ビット用のCコンパイラも探せばあるでしょう。 そうすればビデオモードやら細かいことは考えないで済みますが。
kazuyakazuya

2020/02/10 14:24 編集

文字を表示させるのがこんなに難しいとは・・・ DOSで動かすのは最終手段で。。。 こうなったらBIOSからフォントデーターを受け取るのを諦めて 自分でフォントデータを書き込んでやろうと思ったのですが・・・ mov ax,0b1111111100000000 mov [es:bp],ax これでフォントアドレスのデータを書き換えました。 (ASCII変換関数を使って格納されている値を確認したところ しっかり変更できていた。) が、結果は変わらず。 ・フォントアドレスの取得がそもそも間違えている。 ・VGAモード?かなんかが原因 原因はこのどちらかか・・・ ビデオモードをVGAに~・・・っていうのは VRAM領域に適切にデータを配置させたとしても 今回のように■で埋め作れされているように表示されてしまうんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問