📄 shift.asm
字号:
;;-------------------------------------------------------+-----;; | GMD ;; PROC 'SHIFT' VERSION 1.0 +-----;; DATE 09.10.87 ;; BY BOTT WOLFGANG ;; ;; ;; DESCRIPTION PROGRAMM ZUM SHIFTEN EINER LANGEN ZAHL. ;; EIN POSITIVER FAKTOR BEDEUTET LINKSSHIFT ;; EIN NEGATIVER FAKTOR BEDEUTET (LOGISCHEN) ;; RECHTSSCHIFT. ;; POINTER AUF DIE OPERANDEN SIND 4 BYTE LANG. ;; ;; IN DESCRIPTION ADR: ;; OP1 ZU VERSCHIEBENDE ZAHL [BP] + 6 ;; FAKTOR VERSCHIEBUNGSFAKTOR [BP] + 10 ;; ;; INOUT ;; ;; OUT ;; ERGEBNIS ERGEBNISFELD [BP] + 14 ;; ;;-------------------------------------------------------------;;include asmtoken.h;;--------------------------------------;; ;; BLOCKSTRUKTUR DEFINIEREN. ;; ;;--------------------------------------;;_TEXT SEGMENT BYTE PUBLIC 'CODE'_TEXT ENDS_DATA SEGMENT WORD PUBLIC 'DATA'_DATA ENDSCONST SEGMENT WORD PUBLIC 'CONST'CONST ENDS_BSS SEGMENT WORD PUBLIC 'BSS'_BSS ENDS;DGROUP GROUP _DATA,_BSS,CONSTASSUME CS:_TEXT,DS:DGROUP,SS:DGROUP,ES:DGROUP;;--------------------------------------;; ;; PROGRAMMTEXT: ;; ;; ZUERST REGISTER RETTEN. ;; ;;--------------------------------------;;_TEXT SEGMENT PUBLIC _SHIFT PUBLIC _SSHIFT_SHIFT PROC FAR PUSH BP MOV BP,SP PUSH ES PUSH DI PUSH SI PUSH DS PUSH DS PUSH DS;; OPERAND1 VON FAR IN NEAR UMSPEICHERN; POP ES ; REP MOVS BEFEHL MOV DS,[BP+8] ; VORBEREITEN. MOV SI,[BP+6] ; SOURCE = DS:SI LEA DI,OPER1 ; DEST = ES:DI MOV CX,DS:[SI] ; COUNT = CX SAR CX,1 ADD CX,1 REP MOVSW POP DS POP ES LEA BX,[OPER2] PUSH BX MOV BX,[BP+10] PUSH BX LEA BX,[OPER1] PUSH BXCALL _SSHIFT;; ERGEBNIS VON NEAR IN FAR UMSPEICHERN; MOV ES,[BP+14] MOV DI,[BP+12] MOV CX,OPER2 SAR CX,1 ADD CX,1 LEA SI,OPER2 REP MOVSW ADD SP,6 POP SI POP DI POP ES MOV SP,BP POP BP RET_SHIFT ENDP_SSHIFT PROC NEAR;--------------------------------------;; EIGENTLICHE SHIFT-OPERATION. ;; DIE POINTER AUF DIE OPERANDEN SIND ;; JETZT ALLE 'NEAR'. ;;--------------------------------------; PUSH BP MOV BP,SP PUSH DI PUSH SI;;--------------------------------------;; ;; ADRESSEN DER PARAMETER: ;; ;; OP1 : 4 + (BP) ;; FAKTOR : 6 + (BP) ;; ERGEBNIS : 8 + (BP) ;; ;;--------------------------------------;;;;--------------------------------------;; ;; LOKALE VARIABLEN WERDEN KEINE ;; ;; KEINE BENOETIGT. ;; ;;--------------------------------------;;;;--------------------------------------;; ;; SONDERFAELLE BEARBEITEN: OP1 = 0 ;; UND 'FAKTOR' = 0 ;; ;;--------------------------------------;; MOV BX,[4+BP] ; ADRESSE DER AUS- ; GANGSZAHL MOV SI,[BX] ; LAENGE DERSELBEN CMP SI,0 JE ZERO MOV DX,[6+BP] ; SHIFTFAKTOR LADEN CMP DX,0 JNE TRUESHIFT;;--------------------------------------;; ;; ERGEBNIS = OP1 FALLS 'FAKTOR' = 0 ;; ;;--------------------------------------;; MOV SI,BX ; 'REP MOVS'-BEFEHL MOV DI,[8+BP] ; VORBEREITEN MOV CX,[BX] SAR CX,1 INC CX REP MOVSW JMP RETURN;;--------------------------------------;; ;; FALL, DASS OP1 = 0 ;; ;;--------------------------------------;;ZEROS: ; BP wurde auf dem Stack POP BP ; abgelegt und mu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -