【汇编语言】加减乘除补充用法&&BCD和二进制的转换

八位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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值