参考書でセクタを読み出す関数を定義していたのですがそれに関してわからないところがあるのでお願いします。
作って理解するOS
s
1read_chs: 2 3push bp 4mov bp,sp 5push 3 6push 0 7 8push bx 9push cx 10push dx 11push es 12push si 13 14mov si,[bp + 4] 15mov ch,[si + drive.cyln + 0] 16mov cl,[si + drive.cyln + 1] 17shl cl,6 18or cl,[si + drive.sect] 19 20mov dh,[si + drive.head] 21mov dl,[si + 0] 22mov ax,0x0000 23mov es,ax 24mov bx,[bp + 8] 25 26.10L: 27mov ah,0x02 28mov al,[bp + 6] 29 30int 0x13 31jnc .11E 32 33mov al,0 34jne .10E 35.11E: 36 37cmp al,0 38jne .10E 39 40mov ax,0 41dec word[bp - 2] 42jnz .10L 43 44.10E 45mov ah,0 46 47pop si 48pop es 49pop dx 50pop cx 51pop bx 52 53mov sp,bp 54pop bp 55 56ret 57
mov si,[bp + 4] ;mov bp,sp
mov ch,[si + drive.cyln +0]
mov cl,[si + drive.syln + 0]
ここのくだりが理解できません。
各レジスタにはソフトウエア割り込みを使って読み込みのために適切な情報を
入れますが
その値の入り方がよくわかりません。
このときスタックに積まれているのは
9 si 1バイト push si SP----------------- 8 es 1バイト push es 7 dx 1バイト push dx 6 cx 1バイト push cx 5 bx 1バイト push bx 4 0 1バイト push 0 3 3 1バイト push 3 2 bp 1バイト push bp 1 リターンアドレス 4バイト(プロテクトモードでもそのままアドレスが配置される?)
mov si,[bp + 4] ;によって
siレジスタには6のcxレジスタに入っている値が入るはずですよね?
仮にアドレスだと仮定して考えると・・・
mov ch,[si + drive.cyln +0]
drive.syln は 2バイト(?)だから
4の0になるってことですか?
スタックとこのレジスタに値を入れるため命令らの関係がよく分からないので教えてください。
ご質問の主旨とは違いますが、そもそもコードの書き写しに間違いがないでしょうか。アセンブルが通りませんね、きっと。
> mov si,[bp + 4] ;mov bp,sp
> mov ch,[si + drive.cyln +0]
> mov cl,[si + drive.syln + 0]
は、以下が正しいと思います。(文献を確認してください)
mov si,[bp + 4]
mov ch,[si + drive.cyln + 0]
mov cl,[si + drive.cyln + 1]
そうでないと、スペルミスは置いておいても、CHとCLレジスタに同じ値が入ってしまいます。(意味不明です)
ご指摘の通りミスがあったので訂正しました。
回答2件
あなたの回答
tips
プレビュー