求用汇编语言编四字节二进制数的加法程序

求用汇编语言编四字节二进制数的加法程序,第1张

参考子程序

MOV R0,#ADDRO

MOV R1,#ADDR1

MOV R7,#4(字节数)

CLR C

MOV A,@R0

ADDC @R0,A (A=被加数+加数)

MOV R0,@A

INC R0

INC R1

DJNZ R7, AGAIN

MOV F0,C

RET

完整程序自己来吧

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; prog name:calculating with signed byte ;;

;; date: 081027 ;;

;; author: ivshe ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

model small

data

;signed byte ranging from -128 to +127 (including results!!)

datax db -2 ;(e4H)

datay db 64 ;(0cH)

errmsg db 0dh,0ah,'Wrong inputExit','$'

ofmsg db 0dh,0ah,'OverflowExit','$'

hextable db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,41h,42h,43h,44h,45h,46h

code

startup

;input the operator in AL

;+=2bH,-=2dH,=2aH,/=2fH

mov ah,1h

int 21h

;judge which operation is selected

cmp al,2bh

je _add

cmp al,2dh

je _sub

cmp al,2ah

je _mul

cmp al,2fh

je _div

mov ah,9h

mov dx,offset errmsg ;wrong input

int 21h

jmp exit

_add:

mov ax,0h

mov bx,0h

mov al,datax

mov bl,datay

add al,bl

jo _overflow

call disp

jmp exit

_sub:

mov ax,0h

mov bx,0h

mov al,datax

mov bl,datay

sub al,bl

jo _overflow

call disp

jmp exit

_mul:

mov ax,0h

mov bx,0h

mov al,datax

mov bl,datay

imul bl

;jo _overflow

call disp

jmp exit

_div:

mov ax,0ff00h ;此处有符号扩展

mov bx,0h

mov al,datax

mov bl,datay

idiv bl

call disp

jmp exit

_overflow:

mov dx,offset ofmsg

mov ah,9h

int 21h

jmp exit

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

disp proc

;; procedure name:disp

;; function: display a byte in the form of hex

;; input: al=byte data

;; output: n/a

push cx

push bx

mov bx,offset hextable

push ax

mov ah,2h

mov dl,2ch

int 21h ;输出逗号

pop ax

mov ah,0h

mov cl,al

shl ax,4

mov al,cl

and al,0fh ;将AL的高四位放到AH的第四位,如AL=1101 0010,转换后

;AH=0000 1101 , AL=0000 0010

xlat ;将al中转换成对应16进制的ascii

mov cl,al

mov al,ah

xlat ;将ah中转换成对应16进制的ascii

mov ch,al ;此时CX中存储着两位十六进制的ASCII

mov dl,ch

mov ah,2h

int 21h

mov dl,cl

mov ah,2h

int 21h

pop bx

pop cx

ret

disp endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exit:

mov ax,4c00h

int 21h

end

(加减指令,既作为无符号数影响标志位CF,AF,又作为有符号数影响标志OF,SF。想了半天终于搞清楚了,CF标志反映最高位的进借位情况,而OF反映结果是否溢出,这里的结果是目的 *** 作数中的结果,进借位它是不管的。你这样想的原因是,考虑到CF为1,则肯定溢出了,但是目的 *** 作数中只能保存溢出后的值,丢掉了最高位,所以就不一定溢出了。看例子:

MOV

AX,7896H;

ADD

AL,AH;

;执行完后CF=1,AL=0EH,但是OEH不溢出,所以OF=0;

后面一句也不对吧。)

以上是我个人的理解。

以下是复制别人的理解:

CF

比较简单吧,

没有什么特别的

OF

表示的带符号数进行运算是否溢出

96+78,

一个是正数,

一个为负数,

相加肯定是不会有溢出的

OF

溢出只可能发生在两个相同符号的数值相加,

或者是不同符号数相减

如果是从算法判断上来看,

如果是在运算时,

次高位向最高位和最高位向

CF

位产生进位情形一致的话,

OF=0;

否则

OF=1

96

10010110

+78

01111000

10E

100001110

这里,

次高位和最高位都产生了进位,

情形一致,

所以

OF=0

16

00010110

+78

01111000

08E

10001110

这里,

次高位向最高位产生了进位,

而最高位没有向

CF

产生进位,

所以

OF=1

而且,

结果也是,

两个正数相加,

结果为负数了,

显然溢出

还有两种情况,

也是类似的

一个是都没有产生进位,

那应该是两个小的正数相加,

结果还是正数,

没有溢出;

另外就是次高位没有产生进位,

但最高位产生进位了,

这应该是两个负数相加,

由于次高为位没有产生进位,

所以,

最高位,

也就是符号位结果为

0,

是正数,

显然也是溢出了

以上就是关于求用汇编语言编四字节二进制数的加法程序全部的内容,包括:求用汇编语言编四字节二进制数的加法程序、汇编语言带符号加法的编程、汇编语言中的加减法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9968853.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存