Другие языки программирования и технологии

МП i8080 Ассемблер. Деление на 3

Как разделить в ассеблере чисто (например 2345) на три?
MOV DX, 0 ; Делимое - в пару регистров DX AX
MOV AX, 2345 ; (DX AX) = 2345
MOV BX, 3 ; Делитель в регистр BX
DIV BX ; Теперь АХ = 2345 / 3 = ...
; DX = ...
http://www.av-assembler.ru/instructions/div.php
Заядлый Читерюга
Заядлый Читерюга
20 235
Лучший ответ
Код для деления 16-битных чисел из Intel-овского мануала (8080/8085 Assembly Language Programming Manual):

The following reentrant program uses the B and C registers to hold the dividend and quotient, and the D and E register to hold the divisor and remainder. The H and L registers are used to store data temporarily.

DIV: MOV A, D ;NEGATE THE DIVISOR
CMA
MOV D, A
MOV A, E
CMA
MOV E, A
INX D ;FOR TWO'S COMPLEMENT
LXI H, 0 ;INITIAL VALUE FOR REMAINDER
MVI A, 17 ;INITIALIZE LOOP COUNTER
DV0: PUSH H ;SAVE REMAINDER
DAD D ;SUBTRACT DIVISOR (ADD NEGATIVE)
JNC DV1 ;UNDER FLOW, RESTORE HL
XTHL
DV1: POP H
PUSH PSW ;SAVE LOOP COUNTER (A)
MOV A, C ;4 REGISTER LEFT SHIFT WITH CARRY CY->C->B->L->H
RAL
MOV C, A
MOV A, B
RAL
MOV B, A
MOV A, L
RAL
MOV L, A
MOV A, H
RAL
MOV H, A
POP PSW ;RESTORE LOOP COUNTER (A)
DCR A ;DECREMENT IT
JNZ DV0 ;KEEP LOOPING
;POST-DIVIDE CLEAN UP
;SHIFT REMAINDER RIGHT AND RETURN IN DE
ORA A
MOV A, H
RAR
MOV D, A
MOV A, L
RAR
MOV E, A
RET
END
Waldemar Zimpel
Waldemar Zimpel
24 295