合肥学院マイクロマシン実験4(サブプログラム呼び出し実験コード及び解析)

3096 ワード

.MODEL  TINY
.STACK      100
.DATA    

BUFFER DB 10 DUP(?);BUFFERは8個の不確定数augend DB 2 DUP(?);被加数addend DB 2 DUP(?);加数msg 1 DB 0 DH,0 AH,'被加数を入力してください:$'msg 2 DB 0 DH,0 AH,'加数を入力してください:$'msg 3 DB 0 DH,0 AH,'結果:$';msg 3は結果を格納する.0 DHと0 AHはそれぞれリターンと改行のASCIIコードです;'$'DOS機能呼び出しINT 21 Hにおける9番機能が要求する文字列を表示する終了フラグである.CODE START: MOV AX,@DATA MOV DS,AX MOV ES,AX CLD ;方向標識位置がゼロである.CLDとstdは、方向フラグビットDF(Direction Flag)を操作するためのものである.CLDは、DFをリセット、すなわち、DF=0、stdは、DFをセット、すなわち、DF=1とする.シリアル操作指令に使用されるNOP;空の操作;NOP命令はプログラムカウンタPCに1だけ加算するので、1マシンサイクルを占有する.その目的は、書き込み、読み取りの間に安定した時間MOV AH、00 H MOV AL、03 H INT 10 Hがあることを保証することである.清屏START 1:MOV AH,09 H;9番呼び出しDXは加算されたヘッダアドレスを指し、プロンプト情報LEA DX,msg 1を出力する.ソースオペランドから与えられた有効アドレスは、指定されたレジスタのINT 21 H LEA DI,augendに転送される.DI->augendのヘッダアドレスMOV CX,4;キー数CALL GetBCDKey;2バイトの10進数(加算される)JNB START 2が得られる.何の数字も入力せず、CF=0 MOV AH,09 Hを終了する.9番呼び出しDXは加算されたヘッダアドレスLEA DX,msg 2を指す.ソースオペランドから与えられた有効アドレスは、指定されたレジスタのINT 21 H LEA DI,addendに転送される.diは加算MOV CX,4を指す.キー数CALL GetBCDKey;2バイトの10進数(加算)JNB START 2が得られる.何の数字も入力せず、MOV AL、augendを終了します.加算数の低い8ビットはal ADD AL,addendを送る.Alと加算数の低位加算の結果はal DAAに送る.BCD算術演算調整、圧縮型BCD XCHG AL,AHに変換;高位と低位はMOVALを交換して、augend+1 ADC AL、addend+1;高位DAA XCHG AL,AH MOV BL,0 ADC BL,0;キャリーblはキャリーblとaxの加算が最後の結果stdである.方向標識は1 LEA DI、BUFFER+4を置く.表示結果CALL B 1 toB 2を格納する.低位MOV AL,AH CALL B 1 toB 2;高位MOV AL,BL OR AL,30 H;デジタルSTOSBに変換する.メモリLEA SI,BUFFER MOV CX,5 CALL BlackDisplay;高位0をMOV AH,09 H LEA DX,msg 3を消去する.9番呼び出しDXは結果の先頭アドレスINT 21 H MOV AH,09 H LEA DX,BUFFERを指す.9番呼び出しDXはBUFFERのヘッダアドレスINT 21 H JMP START 1を指す.START 1 START 2:MOV AH,4 CHにジャンプします.終了プログラムINT 21 H;JMP $
;1バイトの圧縮BCDコードを2バイトの数字B 1 toB 2 PROC NEARに変換する.セグメント内PUSH AX;axは加算された結果AND AL,0 FHを格納する.高四位置0 OR AL,30 H;プラス30 H STOSB;数桁のPOP AX AND AL、0 F 0 Hを保存する.低4位置0 ROR AL,4;サイクル右シフト4ビットOR AL,30 H;プラス30 H STOSB;数十ビットの千ビットRET B 1 toB 2 ENDPを保存する
BlackDisplay PROC NEAR CLD ;方向標識クリアMOV DI,SI;Siはdi siがbuffを指す最初のバッファ増分変化BlackDisplay 1:LODSBに送る.高位0を消去し、CMP AL,'0'JNZ Exitをシリアル化する.もしalが0ジャンプEXIT LOOP BlackDisplay 1に等しくないならば;そうでなければ、cxは0ではなく、cx回INC CXをずっと循環します.cxプラス1 Exit:DEC SI;Si前シフトREP MOVSB;バイトMOVAL,'$';$記号をal STOSBに送る.メモリ数RET BlackDisplay ENDP
GetBCDKey PROC NEAR LEA SI,BUFFER MOV AL,4 ;4をbuff MOV[SI],ALに書き込む.【】メモリユニットMOV DX、SI MOV AH、0 AHである.dxはバッファMOVAL,02 Hを指す.0:任意文字1:16進数2:10進数、10進数入力INT 21 H
    MOV AL,[BUFFER+1]   ; buff +1 al
    XOR AH,AH           ;AH   
    MOV CX,AX           ;ax CX cx 
    JCXZ    GetBCDKey3      ;cx 0, GetBCDKey3  cx cx=0
    LEA SI,BUFFER+1     ; 0
    ADD SI,AX           ;ax=4 si=5
    STD                     ;std  si di 

GetBCDKey1: LODSB ;ds:si->al AND AL,0FH ;高4位清零CMP CX,1;JE GetBCDKey2 DEC CX ;進数位-1 MOV AH,AL LODSB AND AL,0 FH SHL AL,4;論理左シフト4ビットOR AL,AH;GetBCDKey2: CLD STOSB ;シリアル命令std LOOP GetBCDKey 1;cx=2はもともと4の上で1回のloopを減らして更に1を減らしたので2 MOV CLに等しくて、[BUFFER]SUB CL、[BUFFER+1]SHR CL、1;論理右シフト1ビットMOVAL,0 CLD REP STOSB;重複メモリSTC;キャリーフラグ位置1 RET GetBCDKey 3:CLC;キャリーフラグビットクリアcf=0 RET;GetBCDKey ENDPに戻る
    END START