本来想用8086汇编做个冒泡排序的,但是最近忙着考试,还有其他一些事,再者高手太多,不敢乱发,今天转正就发个吧
算法没有优化,标记也不怎么好,多多包涵
下面的汇编就是实现加法,加法的位数要大点,改数据段定义的数据长度就行了
data segment
message1 db 'input number one:',0dh,0ah,'$'
message2 db 0dh,0ah,'input number two:',0dh,0ah,'$'
message3 db 0dh,0ah,'result is :',0dh,0ah,'$'
num1 db 200 dup(?) ;加数1
num2 db 200 dup(?) ;加数2
num3 db 201 dup(?),0dh,0ah,'$' ;计算结果
n1 db 0 ;1的位数
n2 db 0 ;2的位数
nl db 0 ;最小位数
nc db 0 ;相差位数
cc db 0 ;选择是谁最大 0 就是1最大,1就是2最大
num db 0 ;进位是否存在的标志
data ends
code segment
assume cs:code,ds:data;es:data
start: mov ax,data
mov ds,ax
;显示提示字符串
mov ah,09h
mov dx,offset message1
int 21h
;读取数字1
mov si,offset num1
m: mov ah,01h
int 21h
cmp al,0dh
je l
mov [si],al
inc n1
inc si
jmp m
;显示提示字符串
l: mov ah,09h
mov dx,offset message2
int 21h
;读取数字2
mov si,offset num2
m2: mov ah,01h
int 21h
cmp al,0dh
je l2
mov [si],al
inc n2
inc si
jmp m2
;获取最小位数 ;获取位数差
l2:
push bx
push ax
mov bl,n1
cmp bl,n2
jng d
mov bh, n2
mov al,n1
sub al,n2
mov nc,al
jmp t
d: mov bh,n1
add cc,1
mov al,n2
sub al,n1
mov nc,al
t: mov nl,bh
pop ax
pop bx
;初始化指针
push ax
xor ax,ax
mov si,offset num1
mov al,n1
sub al,1
add si,al
mov di, offset num2
mov al,n2
sub al,1
add di,al
mov bx,offset num3
push ax
xor ax,ax
mov al,nc
add al,nl
add al,1
add bx,ax
pop ax
;---------------------------------开始计算
;计算相同位
xor cx,cx
mov cl,nl
next: mov ax,[si-1]
sub ah,30h
add ah,[di]
add ah,num
push ax
xor ax,ax
mov ax,0
mov num,al
pop ax
cmp ah,39h
jng s
sub ah,10
add num,1
s: mov al,00h
mov [bx],ax
dec cx
jz x
dec di
dec bx
dec si
jmp next
x: cmp nc ,0
je y
jne y1
y: jmp o ;位数一样就跳到0处
y1: mov cl, nc
cmp cc ,0
je s1 ;第一个数字位数大就跳到s1处
s2: dec di
dec bx
cmp num ,0
je x3
xor ax,ax
mov ah,31h
mov [bx],ax
sub num,1
mov ax,[di-1]
mov al,00h
sub ah,30h
add [bx],ax
jmp w5
x3: mov ax,[di-1]
mov al,00h
add [bx],ax
w5: cmp [bx],3900h
jng s4
sub [bx],0a00h
add num,1
s4: dec cx
jz o
jmp s2
s1: dec si
dec bx
cmp num ,0
je x4
xor ax,ax
mov ah,31h
mov [bx],ax
sub num,1
mov ax,[si-1]
mov al,00h
sub ah,30h
add [bx],ax
jmp w2
x4: mov ax,[si-1]
mov al,00h
add [bx],ax
w2: cmp [bx],3900h
jng s7
sub [bx],0a00h
add num,1
s7: dec cx
jz o
jmp s1
;处理最高位超出
o: cmp num,0
je n
mov ax,3100h
dec bx
mov [bx],ax
;----------------------------------------------
;显示提示字符串和结果
n: mov ah,09h
mov dx,offset message3
int 21h
mov ah,09h
mov dx,offset num3
int 21h
q: mov ah,4ch
int 21h
code ends
end start
[课程]FART 脱壳王!加量不加价!FART作者讲授!