3

以下のコードを使用すると、マウスで画面上に描画でき、完璧に機能します。私の問題は、なぜCX2で割る必要があるのですか? そもそもなんで倍増するの?

code segment
main proc far

mov al, 12h
mov ah, 0   ; set graphics video mode.
int 10h   

mov ax, 1   ;shows mouse cursor
int 33h

Next:
mov ax, 3   ;get cursor positon in cx,dx
int 33h

call putpix ;call procedure 
jmp Next

mov ah,4ch
int 21h
main endp

;procedure to print
putpix proc   
mov al, 7   ;color of pixel  
mov ah, 0ch    
shr cx,1    ; cx will get double so we divide it by two
int 10h     ; set pixel.
ret
putpix endp
code ends 
4

2 に答える 2

1

EMU8086 の次のスクリーンショットとあなたのコードは、何が起こっているのかを理解するのに役立ちます:

  • 紫色の矢印はビデオ モード 12h を示しており、これは 640x480 です。
  • 青い矢印は、コードが CX、DX でカーソル位置を取得したときのカーソルの位置を示しています。それは右下隅です。最大値を取得するために意図的に行いました。
  • この時点で実行を停止し、CX と DX の値 (黄色のバー) を確認するために、「readkey」コード スニペットを追加しました。
  • 赤い矢印は、CX と DX の値を示しています。DX は 01DB = 475 で、範囲は 0..479 です。ただし、CX は 04FA = 1274 (緑の矢印) です。ビデオ モードでは 0..639 の範囲の列が許可されているため、これは不可能です。
  • 結論は簡単です。マウス割り込み 33h は、カーソル列の 2 倍の値を返します。これを解決する方法は、列を 2 で割ることです ( shr cx,1)。

ここに画像の説明を入力

于 2015-06-11T16:31:20.063 に答える