王双アセンブリ言語パートVIII(関数は、呼び出しを書いて、一緒に使用RET)

問題:除算を行うDIV使用する場合は、保存されたレジスタの範囲を超えるあまりビジネスの結果があるかもしれない、このエラーは、除算オーバーフローと呼ばれています。

分割オーバーフローを解決するための式があります。

X:配当、範囲[0、FFFFFFFF]
N:除数、範囲[0、FFFF]
H:X-高い16の範囲[0、FFFF]
L:Xロー16、範囲[0、FFFF]

INT():記述オペレータ、プロバイダが取る、例えば、INT(10分の38)= 3。
REM()演算子の説明、例えば、余りを取る、REM(10分の38)= 8

式:X / N = INT(H / N)* 65536 + [REM(H / N)* 65536 + L] / N

ソリューション:
1、引数が高いデータと低いデータ除数であります

2.結果:
'intとしてのハイ(H / N)* 65536
のの低い[REM(H / N)* 65536 + L] 一覧/ N、
残部は、[REM(H / N)* 65536 + L] / Nの剰余

3、工程:
(1)まず、次いでハイパスデータax、着信除数CX、DIV CX、
AX INT(H / N)の値が高い結果を得ることができ
、そしてDXの値を(2)このときに、32ビットの高データ利用DIV DXが高配当の存在、低い配当AXの存在である16ビット、16ビット相当する左65536を乗じREM(H / N)は、と等価ですDXは注文データを保存した
、最後に(3)低入力データAX、DIV CXを、ビジネスが低い結果であり、残りは残りの結果です。

書き込みコード:
主な機能

;计算1000000/10=F4240H/0AH,结果为186A0H

 mov ax,4240h;数据的低位
 mov dx,0fh;数据的高位
 mov cx,0ah;除数
 call divdw;调用子函数
 mov ax,4c00h
 int 21h

以下のための関数

divdw:
 push si
 push bx;保存现场
 mov bx,ax
 mov ax,dx;把数据的高位传入AX
 mov dx,0
 div cx;结果AX的数值为结果的高位,DX的数值为rem(H/N)
 mov si,ax
 mov ax,bx;把数据的低位传入AX
 div cx;结果AX的数值为结果的低位,DX的数值为结果的余数
 mov cx,dx
 mov dx,si
 pop bx;恢复现场
 pop si
ret;函数返回

コール命令

コール命令の処理が実行される
(1)又は現在のIP CSとIPスタック上に
(2)転送

呼参照
対応は、
IPプッシュ
PTR数字の近くにJMPを

遠くPTRラベルを呼び出すこと
と等価である
プッシュCS
プッシュIP
JMP FARのPTRラベル

メモリの呼び出しワードPTRアドレス
に対応する
IPプッシュ
メモリのjmpのワードPTRアドレス
例:

mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
;执行后,(IP)=0123h,(sp)=0EH

メモリのDWORD PTRアドレス呼び出し
に対応する
CSを押して
IPプッシュ
メモリのJMP DWORD PTRアドレスを

例:

mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]
;执行后,(CS)=0,(IP)=0123h,(sp)=0cH

RETとRETF

RET命令データスタック、IPの内容、ほとんどの転送が可能
RETF命令データ・スタックを、CSとIPの内容を変更し、離れて転送を可能に

コールとRETを使用して
フレームのソースサブプログラムを持つことは、次のとおりです。

assume cs:code
code segment
 main:
 call sub1
 :
 :
 mov ax,4c00h
 int 21h
sub1:
:
:
call sub2
:
:
ret

sub2:
:
:
ret
code ends
end main
リリース8元の記事 ウォンの賞賛0 ビュー78

おすすめ

転載: blog.csdn.net/qq_41955402/article/details/104309070