求汇编高手帮忙编写一段程序

2025-12-05 22:39:43
推荐回答(1个)
回答1:

这回完全测试通过了,
除了代码比较冗余。

如果看不懂可以在MSN找我。
feng.gzh@hotmail.com

----------------------------------------------------------------------
.model small
.data
data1 db 6 dup(0) ;多的一位是符号位,其中保存正号或者负号的ascii
data2 db 5 dup(0)
data3 db 5 dup(0)
;p_big dd 0
;p_small dd 0

input1 db 6,0,6 dup(?) ;键盘缓冲区
input2 db 6,0,6 dup(?)
msg db 'Please input a number(XXXXX): ','$'
.code
.startup
;;;;;;;;;;;;;;界面输入输出部分;;;;;;;;;;;;;;;;;;;

mov ah,9h
mov dx,offset msg
int 21h

mov dx,offset input1
mov ah,0ah
int 21h

mov ah,2h
mov dl,0ah
int 21h ;输出逗号

mov ah,2h
mov dl,0dh
int 21h

mov dx,offset input2
mov ah,0ah
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;数据倒置装入部分;;;;;;;;;;;;;;;;;;;

;开始将数据倒置装入data1,data2
xor cx,cx ;clear
mov cl,input1[1]
;sub cl,1h ;确定循环次数
lea si,input1
add si,1h
add si,cx
;sub si,1h ;将SI指向数据的最低位
mov bx,offset data1
std ;设置方向为反响

n1:
lodsb
sub al,30h ;将ascii转换为数值
mov [bx],al
inc bx
loop n1

mov cl,input2[1]
lea si,input2
add si,1h
add si,cx
mov bx,offset data2

n2:
lodsb
sub al,30h ;将ascii转换为数值
mov [bx],al
inc bx
loop n2

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

;;;;;;;;;;;;;;数据大小比较部分;;;;;;;;;;;;;;;;;;;

mov ah,input1[1]
mov al,input2[1] ;两个数据的位数

cmp ah,al
jb _below
je _equal

_big:
;data1>data2
mov data1[5],2bh ;正号
jmp do_sub

_equal:
mov data1[5],2bh ;正号
xor cx,cx ;clear
mov cl,ah ;逐个比较,设置比较次数
n4:

mov si,cx

mov ah,data1[si-1h]
mov al,data2[si-1h]

cmp ah,al
ja _big
jb _below
loop n4 ;equal

;执行到这里的情况是两个数相等

jmp do_sub

_below:
;若data1 ;进行调换

mov cx,5h ;循环次数
mov bx,0h

n5:
mov ah,data1[bx]
mov al,data2[bx]

xchg ah,al

mov data1[bx],ah
mov data2[bx],al

inc bx
loop n5
mov data1[5],2dh ;负号

;;;;;;;;;;;;;;数据减法计算部分;;;;;;;;;;;;;;;;;;;
;入口
;
; dl保存是否借位
do_sub:
mov dl,0h ;清除进位标志位
mov si,0h
mov cx,5h ;循环次数
n3:

mov ah,data1[si]

mov al,data2[si] ;分别取两个数据
inc si
sub ah,dl ;先将前一位的借位处理

cmp ah,al
jl _neg
sub ah,al ;实际的减法运算
mov dl,0h ;清除借位
add ah,30h ;还原为ascii
mov data1[si-1],ah

loop n3
jmp exit
_neg:
add ah,0ah
sub ah,al
add ah,30h ;还原为ascii
mov dl,1h ;设置借位
mov data1[si-1],ah

loop n3

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

exit:
mov ax,4c00h
int 21h

end