
参考子程序
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,
是正数,
显然也是溢出了
以上就是关于求用汇编语言编四字节二进制数的加法程序全部的内容,包括:求用汇编语言编四字节二进制数的加法程序、汇编语言带符号加法的编程、汇编语言中的加减法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)