📄 div.s
字号:
ADD SP,6 MOV BX,[6+BP] ; DAS GLEICHE FUER PUSH BX ; DEN DIVISOR MOV CX,SFAKTOR PUSH CX PUSH BX CALL _SSHIFT ADD SP,6;;--------------------------------------;; ;; DRITTER SCHRITT: DIVISION ;; ;;--------------------------------------;;STARTDIV: MOV BX,[6+BP] ; ADRESSE DIVISOR MOV SI,[BX] ; INDEXREGISTER ; FUER SCHLEIFEN ; UEBER DEN DIVISOR MOV AX,[BX+SI] ; HOECHSTWERTIGSTE MOV FIRSTDIGIT,AX ; ZIFFER DES ; DIVISORS WIRD ; DAUERND GEBRAUCHT MOV DI,DIVIDENT ; ZAHL DER DIVISIONS- SUB DI,SI ; SCHRITTE BESTIMMEN ; 'DI' IST INDEX- ; REGISTER FUER ; 'QUOTIENT' PUSH BP ; 'BP' RETTEN LEA BP,[DIVIDENT+DI] ; 'BP' IST BASIS- ; REGISTER FUER ; 'DIVIDENT' MOV WORD PTR [2+BP+SI],0 ; DIESE ZIFFER WIRD ; IN DER ERSTEN DIVI- ; SION GEBRAUCHT;;--------------------------------------;; ;; SCHLEIFE ZUR DIVISION: ;; ;;--------------------------------------;;MAINLOOP: MOV DX,[2+BP+SI];HOECHSTWERTIGSTE ; ZIFFER DES DIVI- ; DENTEN LADEN CMP DX,FIRSTDIGIT ; FALLS GLEICH, JNE DODIVIDE ; DIVISION NICHT ; MOEGLICH MOV ZQUOT,-1 ; DAS IST DANN DIE ; AKTUELLE ZIFFER ; DES QUOTIENTEN JMP DOTESTDODIVIDE: MOV AX,[BP+SI] ; ZWEITHOECHSTE ; ZIFFER DES DIVI- ; DENTEN LADEN DIV FIRSTDIGIT ; UND DIVIDIEREN MOV ZQUOT,AX ; ERGIBT AKTUELLE ; ZIFFER DES ; QUOTIENTEN;;--------------------------------------;; ;; NAEHERUNG FUER DEN QUOTIENTEN WIRD ;; AN ZWEI ZIFFERN GETESTET ;; ;;--------------------------------------;;DOTEST: MOV AX,[-2+BX+SI] ; ZWEITHOECHSTE ; ZIFFER DES ; DIVISORS MUL ZQUOT ; MULTIPLIZIEREN ; MIT DER ; GEFUNDENEN ; ZIFFER DES ; QUOTIENTEN MOV CX,DX ; UEBERTRAG MERKEN MOV TEST,AX MOV AX,FIRSTDIGIT ; HOECHSTWERTIGSTE ; ZIFFER DES ; DIVISORS MUL ZQUOT ADD AX,CX ; UEBERTRAG ADDIEREN JNC NOCARRY1 ; DABEI KOENNTE ES INC DX ; EINEN NEUEN UEBER- ; TRAG GEBENNOCARRY1: MOV TEST+2,AX ; ERGEBNIS SPEICHERN MOV TEST+4,DX ; IM TESTFELD;;--------------------------------------;; ;; DER VERGLEICH DER DES TESTFELDES ;; MIT DEN ZIFFERN DES DIVIDENTEN MUSS ;; BYTEWEISE ERFOLGEN, DA DER 'CMP'- ;; BEFEHL DAS VORZEICHEN BERUECKSICHTIGT;; ;;--------------------------------------;; XOR AX,AX ; LOESCHEN FUER XOR DX,DX ; DEN BYTEWEISEN ; VERGLEICH PUSH DI ; 'DI' WIRD ; BENOETIGT LEA DI,[3+SI] ; SCHLEIFE ZUM MOV SI,5 ; VERGLEICH MOV CX,6 ; VORBEREITENLOOPCMP: MOV AL,BYTE PTR [TEST+SI] ; EIN BYTE DES TEST- ; FELDES LADEN MOV DL,[BP+DI] ; EIN BYTE DES DIVI- ; DENTEN LADEN CMP AX,DX ; VERGLEICHEN JL OKAY JG DOCORRECT DEC SI ; ZEIGER DEC DI ; FORTSCHALTEN LOOP LOOPCMP JMP OKAYDOCORRECT: DEC ZQUOT ; PROBEQUOTIENT ; MUSS VERKLEINERT ; WERDEN;;--------------------------------------;; ;; DIVISOR * QUOTIENT WIRD NUN VOM ;; DIVIDENTEN ABGEZOGEN ;; ;;--------------------------------------;;OKAY: POP DI ; 'DI' ZURUECKHOLEN MOV SI,2 ; ZEIGER SETZEN XOR CX,CX ; UEBERTRAG LOESCHENLOOPSUB: MOV AX,[BX+SI] ; ZIFFER DES ; DIVISORS LADEN MUL ZQUOT ; MULTIPLIZIEREN ADD AX,CX ; UEBERTRAG ADDIEREN JNC NOCARRY2 ; DABEI KANN EIN INC DX ; NEUER UEBERTRAG ; AUFTRETENNOCARRY2: SUB [BP+SI],AX ; VON DER ENTSPRECH- ; ENDEN ZIFFER DES ; DIVIDENTEN ABZIEHEN JNC NOCARRY3 ; WIEDER KANN EIN INC DX ; UEBERTRAG ENT- ; STANDEN SEINNOCARRY3: MOV CX,DX ; UEBERTRAG MERKEN ADD SI,2 ; ZEIGER FORTSCHALTEN CMP SI,[BX] ; ALLE ZIFFERN DES ; QUOTIENTEN BEAR- JNG LOOPSUB ; BEITET ?;;--------------------------------------;; ;; NUN ENTSCHEIDET SICH, OB DER ;; QUOTIENT ZU GROSS WAR: ;; ;;--------------------------------------;; SUB [BP+SI],CX ; LETZTEN UEBERTRAG ; SUBTRAHIEREN JNC NOREADD;;--------------------------------------;; ;; DIVISOR MUSS EINMAL AUF DEN DIVI- ;; DENTEN AUFADDIERT WERDEN ;; ;;--------------------------------------;; DEC ZQUOT ; ZIFFER DES QUO- ; TIENTEN VERMINDERN MOV SI,2 ; NEUE SCHLEIFE MOV CX,[BX] ; INITIALISIEREN SHR CX,1 CLC ; UEBERTRAG LOESCHENLOOPREADD: MOV AX,[BX+SI] ; ZIFFER DES QUO- ; TIENTEN LADEN ADC [BP+SI],AX ; AUF ENTSPRECHENDE ; ZIFFER DES DIVI- ; DENTEN ADDIEREN INC SI ; ZEIGER WEITER- INC SI ; SCHALTEN, OHNE ; CARRYBIT ZU AENDERN LOOP LOOPREADD MOV WORD PTR [BP+SI],0 ; HIER MUSS NUN 0 HIN;;--------------------------------------;; ;; HAUPTSCHLEIFE FAST BEENDET: ZEIGER ;; WIRD NOCH WEITERGESCHALTET UND DIE ;; ZIFFER DES QUOTIENTEN EINGETRAGEN ;; ;;--------------------------------------;;NOREADD: MOV AX,ZQUOT MOV [QUOTIENT+2+DI],AX SUB BP,2 MOV SI,[BX] SUB DI,2 JS ENDDIV JMP MAINLOOP;;--------------------------------------;; ;; ENDE DER DIVISION: LAENGE DES ;; QUOTIENTEN UND DES RESTES - ER ;; STEHT IM FELD 'DIVIDENT' - BESTIMMEN ;; ;;--------------------------------------;;ENDDIV: MOV SI,[BX] ; DIE LAENGE DES MOV DI,[2+BP] ; QUOTIENTEN IST BIS SUB DI,SI ; AUF EINE STELLE ; FESTGELEGT CMP WORD PTR [QUOTIENT+2+DI],0 JE NOCORRQ2 ADD DI,2NOCORRQ2: MOV QUOTIENT,DILOOPCHKLGTH: ; LAENGE DER RESTES ; KANN NICHT VORHER- ; GESAGT WERDEN UND ; MUSS IN EINER ; SCHLEIFE BESTIMMT ; WERDEN. CMP WORD PTR [DIVIDENT+SI],0 JNE FOUND SUB SI,2 JNZ LOOPCHKLGTHFOUND: MOV DIVIDENT,SI;;--------------------------------------;; ;; ERWEITERUNG RUECKGAENGIG MACHEN ;; ;;--------------------------------------;; POP BP CMP SFAKTOR,0 JE NORESHIFT MOV SI,SFAKTOR NEG SI PUSH BX ; ERSTER AUFRUF PUSH SI ; VON 'SHIFT' FUER PUSH BX ; DEN DIVISOR CALL _SSHIFT ADD SP,6 LEA BX,DIVIDENT PUSH BX ; ZWEITER AUFRUF VON MOV SI,SFAKTOR ; 'SHIFT' FUER DEN NEG SI ; REST DER DIVISION PUSH SI PUSH BX CALL _SSHIFT ADD SP,6;;--------------------------------------;; ;; ERGEBNISSE UEBERTRAGEN; QUOTIENT ;; KOMMT ZUERST DRAN UND WIRD DABEI ;; EVENTUELL UEBERSCHRIEBEN VOM REST. ;; ;;--------------------------------------;;NORESHIFT: MOV CX,QUOTIENT SHR CX,1 INC CX MOV DI,[8+BP] LEA SI,QUOTIENT REP MOVSW MOV CX,DIVIDENT SHR CX,1 INC CX MOV DI,[10+BP] LEA SI,DIVIDENT REP MOVSW XOR AX,AXRETURN: POP SI POP DI MOV SP,BP POP BP RET_SDIV ENDP_TEXT ENDS_DATA SEGMENT PUBLIC TEST,SFAKTOR,ZQUOT PUBLIC QUOTIENT,FIRSTDIGIT,DIVIDENTTEST DW 3 DUP(?)SFAKTOR DW 0ZQUOT DW 0QUOTIENT DW RSAINT DUP(?)OPER1 DW RSAINT DUP(?) DW RSAINT DUP(?)OPER2 DW RSAINT DUP(?)OPER3 DW RSAINT DUP(?)OPER4 DW RSAINT DUP(?)FIRSTDIGIT DW 0DIVIDENT DW RSAINT DUP(?) DW RSAINT DUP(?)_DATA ENDS END;-------------------------------------------------------------;; E N D O F P R O C E D U R E DIV ;;-------------------------------------------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -