折腾来折腾去

pikipity的blog

汇编实战之加减法

上一篇《汇编语言初学者遇到的困难和解决方法》中讲述了汇编新手可能会遇到的问题和解决办法,接下来就通过汇编的实例来将方法运用到实际问题中去。这一篇是编写最基本的加减法,每一种运算都以子程序的形式呈现出来。声明:以下程序皆由pikipity自己想出,绝对不是最好的,因为

世界上最好的程序是自己想出来的程序

两个16位二进制之间的加法

算法

通过查8051汇编指令表,我们就可以发现,其中已经提供了两个有关8位二进制之间的加法的指令,两个指令是

ADD A,<byte>
ADDC A,<byte>

两条指令都是对累加器Acc作用,并且其中的\<byte>都支持直接寻址、间接寻址、寄存器寻址和立即寻址四种寻址方式。不同也是显而易见的,ADDC的加法中会包括进位C,而ADD中则不包括。

清楚了要使用的主要指令后,就是算法了,由于这两条命令的计算单位都是8位二进制,所以我们也以8位来考虑。这里我们用$[b_n\cdots b_0]$的方式代表一个二进制数$b$中的从最低第$0$位到第$n$位。让我们假设两个16位二进制数分别是$a$和$b$,它们的和是$c$。算法很简单如下,

$$\begin{array}{rcl} c & = & a+b \ & = & [a{15}\cdots a_0]+[b{15}\cdots b_0]\ &=&[a{15}\cdots a{8}]\times 256+[a_7\cdots a_0]+[b{15}\cdots b_8]\times 256+[b_7\cdots b_0]\ [c{15}\cdots c_8]\times 256+[c_7\cdots c_0]&=&\left([a{15}\cdots a_8]+[b{15}\cdots b_8]\right)\times 256+\left([a_7\cdots a_0]+[b_7\cdots b_0]\right) \end{array}$$

比较等号两边我们就可以发现,只要让16位二进制的高八位相加做得数的高八位,低八位相加做得数的低八位就可以了。

但是要注意,低八位相加得数的范围是$0\sim510$,所以有可能会产生一个新的256到高八位里面,在高八位相加的时候需要考虑进去(也就是要考虑低八位的进位)。

汇编子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sumation of unsigned number
;input: 16 bits: 70H 71H
;       16 bits: 72H 73H
;output: C and 16 bits 74H 75H
;Reg: A (have been protected), C
SUM_unsigned:
    PUSH Acc  ;protect Acc
    CLR C     ;clear C
    ;Add low 8 bits
    MOV A,71H
    ADDC A,73H
    MOV 75H,A
    ;Add high 8 bits and C
    MOV A,70H
    ADDC A,72H
    MOV 74H,A
    ; 
    POP Acc   ;return Acc
    RET

两个16位二进制之间的减法

算法

通过查汇编指令表,我们可以发现,8051中已经提供了一条关于8位二进制减法的指令。

SUBB A,<byte>

和加法类似,我们可以用这条命令来考虑我们的算法了。

$$\begin{array}{rcl} c&=&a-b\ [c{15}\cdots c_8]\times 256+[c_7\cdots c_0]&=&\left([a{15}\cdots a_8]-[b_{15}\cdots b_8]\right)\times 256+\left([a_7\cdots a_0]-[b_7\cdots b_0]\right) \end{array}$$

我们可以发现,同样的,高八位相减就是得数的高八位,低八位相减就是得数的低八位。注意,低八位相减有可能需要从高八位借一个256,所以高八位相减需要考虑低八位的借位,如果得数是负数(也就是$a<b$),就将C置一。

汇编子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Subtraction of unsigned number
;input: 16 bits: 76H 77H
;       16 bits: 78H 79H
;output: C and 2bytes: 7AH 7BH
;Reg: A(have been protected), C
Subtraction:
    PUSH Acc    ;protect Acc
    CLR C       ;Clear C
    ;subtraction of low 8 bits
    MOV A,77H
    SUBB A,79H
    MOV 7BH,A
    ;subtraction of high 8 bits
    MOV A,76H
    SUBB A,78H
    MOV 7AH,A
    ;
    POP Acc    ;get back Acc
    RET

加减法的考虑还是很简单,接下来会介绍一下比较难的乘除法的考虑方法



Comments