八位16进制相加
;R0R1+R2R3=R4R5
;----------------------------------------------------------------
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
R0 DW (?)
R1 DW (?)
R2 DW (?)
R3 DW (?)
R4 DW (?)
R5 DW (?)
R6 DW (?)
R7 DW (?)
DATA ENDS
WWADD SEGMENT
MAIN PROC FAR
ASSUME CS:NDWADD,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
MOV AX,R1
ADD AX,R3
MOV R5,AX ;低两位相加结果保存在R5
MOV AX,R0
ADC AX,R2
MOV R4,AX ;高两位相加结果保存在R4
RET
MAIN ENDP
WWADD ENDS
END START
八位16进制相减
;R0R1-R2R3=R4R5
;----------------------------------------------------------------
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
R0 DW (?)
R1 DW (?)
R2 DW (?)
R3 DW (?)
R4 DW (?)
R5 DW (?)
R6 DW (?)
R7 DW (?)
DATA ENDS
WWSUB SEGMENT
MAIN PROC FAR
ASSUME CS:NDWSUB,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
MOV AX,R1
SUB AX,R3
MOV R5,AX ;低两位相减结果保存在R5
MOV AX,R0
SBB AX,R2
MOV R4,AX ;高两位相减结果保存在R4
RET
MAIN ENDP
WWSUB ENDS
END START
八位16进制相乘
;R2R3*R6R7=R4R5R6R7
; R2R3
; *R6R7
;-----------------------------------
; R7R3
; R6R3
; R7R2
; +R6R2
;------------------------------------
; R4R5R6R7
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
R0 DW (?)
R1 DW (?)
R2 DW (?)
R3 DW (?)
R4 DW (0)
R5 DW (0)
R6 DW (?)
R7 DW (?)
DATA ENDS
WWMUL SEGMENT
MAIN PROC FAR
ASSUME CS:NDWSUB,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
MOV AX,R3
MUL R7 ;R3*R7=DXAX
XCHG R7,AX
MOV R5,DX ;由于R6与R7都要参与之后的运算,故R6的值暂存于R5
MUL R2
ADD R5,AX
MOV AX,DX
ADC R4,AX
PUSHF ;R2*R7,压栈R4位的进位情况
;R5的值暂存于R4
MOV AX,R6
MUL R3
ADD R5,AX
MOV AX,DX
ADC R4,AX
PUSHF ;R3*R6,压栈R4位的进位情况
MOV AX,R6
MUL R2
MOV R6,0
POPF
ADC AX,R6
ADC DX,R6
POPF
ADC AX,R6
ADC DX,R6 ;将压栈的R4位的进位情况弹出至R2*R6=DXAX中
ADD R4,AX
MOV AX,0
ADC DX,AX ;R2*R6,R4的值暂存于DX
MOV AX,R5
MOV R6,AX
MOV AX,R4
MOV R5,AX
MOV R4,DX ;将暂存的值全部传递到目标位置
RET
MAIN ENDP
WWMUL ENDS
END START
十六位16进制除以八位16进制
;R1R2R3R4/R5R6=R1R2R3R4...R7R8R9
;定义temp=0位数与R1R2R3R4二进制位数(从1开始算,从右往左数)一样,用于中间变量及保存余数
;定义循环次数i=1,定义商的为R1R2R3R4(从1开始算,从左往右数)
;while(i++ <= R1R2R3R4二进制位数){
; temp<<1 = R1R2R3R4第i位;
; if(temp-R5R6<0) 置商的的第i位为0;
; else 置商的的第i位为1,并将相减结果保存在temp中;}
;----------------------------------------------------------------
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
R1 DW (?)
R2 DW (?)
R3 DW (?)
R4 DW (?)
R5 DW (?)
R6 DW (?)
R7 DW (?)
R8 DW (?)
R9 DW (0)
SET_1 DW 8000H
SET_0 DW 7FFFH,
DATA ENDS
WWDIV SEGMENT
MAIN PROC FAR
ASSUME CS:NDWSUB,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
CLC ;置CF=0
MOV CX,64
DIV0: RCR R1,1
RCR R2,1
RCR R3,1
RCR R4,1;弹出R1R2R3R4的最低位到CF中
PUSHF
POP R0
TEST BYTE PTR R0,01H
JNZ DIV1;若CF=1,则把1赋值到TEMP中
JZ DIV2;若CF=0,则把0赋值到TEMP中
DIV1: STC ;置CF=1
RCL R9,1
RCL R8,1
RCL R7,1
JMP DIV3
DIV2: CLC ;置CF=0
RCL R9,1
RCL R8,1
RCL R7,1
JMP DIV3;判断TEMP-R5R6的正负性
DIV3: MOV AX,R9
SUB AX,R6
MOV AX,R8
SBB AX,R5
MOV AX,R7
MOV BX,0
SBB AX,BX
JNC DIV4;TEMP-R5R6大于等于0
JC DIV5;TEMP-R5R6小于0
DIV4: SUB R9,R6
SBB R8,R5
MOV AX,0
SBB R7,AX
XOR R1,SET_1
LOOP DIV0
JMP DIV6
DIV5: AND R1,SET_0
LOOP DIV0
DIV6: RET
MAIN ENDP
WWDIV ENDS
END START
二进制数据转换成组合BCD码
;R5R6R7(二进制)=buffer7buffer6...buffer1buffer0(BCD码)
;2^48=3*10^14,BCD码共有16位 组合BCD码:4位二进制保存一个0-9
;根据秦九韶原理进行转换,例:(1101)二进制=(((1*2+1)*2+0)*2+1十进制
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
BWORD EQU THIS BYTE
R0 DW (?)
R1 DW (?)
R2 DW (?)
R3 DW (?)
R4 DW (?)
R5 DW (?)
R6 DW (?)
R7 DW (?)
buffer0 DB (0)
buffer1 DB (0)
buffer2 DB (0)
buffer3 DB (0)
buffer4 DB (0)
buffer5 DB (0)
buffer6 DB (0)
buffer7 DB (0)
DATA ENDS
BCTD SEGMENT
MAIN PROC FAR
ASSUME CS:NDWSUB,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
MOV CX,48
DO_LOOP: CLC
RCL R7,1
RCL R6,1
RCL R5,1 ;R7R6R5左移一位将结果保存在CF
MOV AL,buffer0
ADC AL,AL ;第一个buffer0的加上了R7R6R5左移一位的结果,然后乘2
DAA
MOV buffer0,AL
MOV AL,buffer1
ADC AL,AL
DAA
MOV buffer1,AL
MOV AL,buffer2
ADC AL,AL
DAA
MOV buffer2,AL
MOV AL,buffer3
ADC AL,AL
DAA
MOV buffer3,AL
MOV AL,buffer4
ADC AL,AL
DAA
MOV buffer4,AL
MOV AL,buffer5
ADC AL,AL
DAA
MOV buffer5,AL
MOV AL,buffer6
ADC AL,AL
DAA
MOV buffer6,AL
MOV AL,buffer7
ADC AL,AL
DAA
MOV buffer7,AL ;之后的buffer1-buffer7依次进行逐位乘2操作
LOOP DO_LOOP
RET
MAIN ENDP
BCTD ENDS
END START
非组合BCD码转换成二进制数据
;b9b4...b1b0(BCD码)=R1R0(二进制)
;2^32=4*10^9,BCD码共有10位 非组合BCD:8位二进制保存一个0-9
;根据秦九韶原理进行转换,例:(234)BCD码=(((0*10+2)*10+3)*10+4二进制
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
DATA SEGMENT
R0 DW (?)
R1 DW (?)
R2 DW (?)
buffer0 DB (?)
buffer1 DB (?)
buffer2 DB (?)
buffer3 DB (?)
buffer4 DB (?)
buffer5 DB (?)
buffer6 DB (?)
buffer7 DB (?)
buffer8 DB (?)
buffer9 DB (?)
DATA ENDS
DCTB SEGMENT
MAIN PROC FAR
ASSUME CS:DCTB,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX ;标准序
LEA BX,buffer0
MOV R0,0
MOV R1,0
MOV CX,10
DO_LOOP: MOV AX,R0
MOV R2,10
MUL R2
MOV R0,AX ;R0=(R0*10)低位
XCHG DX,R1 ;R1=(R0*10)高位
MOV AX,DX
MUL R2
ADD R1,AX ;R1+=(R1*10)低位
MOV AL,[BX]
MOV AH,0
ADD R0,AX ;R0+=bufferx(x=0,1,2...9)
ADC R1,0 ;R1+=CF
DEC BX
LOOP DO_LOOP
RET
MAIN ENDP
DCTB ENDS
END START