HeatDeath 2016-04-25 06:00 采纳率: 0%
浏览 638
已结题

汇编求两个任意位数的十进制数字的差,并输出。结果总是输出10进制的补码是什么情况

data segment
    buff1 db 20         ;存放最大字符个数
    n1 db ?             ;实际存放字符个数
    content1 db 20 dup(0)       ;存放输入字符
    buff2 db 20         ;buf=buffer缓冲区,content目录
    n2 db ?
    content2 db 20 dup(0)
    buff4 db 21 dup(0)      ;buff3用于存放结果
data ends

code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
buffa:
    mov dx,offset buff1     
    mov ah,0ah      
    int 21h

    mov dl,0ah          
    mov ah,2
    int 21h
buffb:
    mov dx,offset buff2 
    mov ah,0ah      
    int 21h

    mov cl,n1
    mov si,offset content1
transfer1:              
    sub byte ptr[si],30h        
    inc si          
    loop transfer1          
    dec si          
    mov di,si       

    mov cl,n2       
    mov si,offset content2      
transfer2:
    sub byte ptr[si],30h
    inc si
    loop transfer2
    dec si              
    mov bx,si       
;=====================================
subbbb:
    mov si,offset buff4
    mov dl,n1
    cmp dl,n2

    clc
    jg lowern2
    mov cl,n1
    mov dl,n2
;=========n1<=n2================
subln1:
    mov al,[di]
    sbb al,[bx]

    aas
    mov [si],al
    inc si
    dec di
    dec bx
    loop subln1
    pushf

    mov cl,n2
    sub cl,n1
    cmp cl,0
    je ifequ
    popf
;=========================
remain1n1:
    mov al,0
    sbb al,[bx]
    aas
    mov [si],al
    inc si
    dec bx
    loop remain1n1
    jmp done
;==========================
lowern2:
    mov cl,n2
    mov dl,n1
subln2:
    mov al,[di]
    sbb al,[bx]
    aas
    mov [si],al
    inc si
    dec di
    dec bx
    loop subln2
    pushf
    mov cl,n1
    sub cl,n2

remain1n2:
    mov al,0
    sbb al,[di]
    aas
    mov [si],al
    inc si
    dec di
    loop remain1n2
;=============================
done:
    jnc over
    jmp refinement
;===========================
ifequ:
    popf
    jnc over
;===========================
refinement:
    mov al,0
    sbb al,0
    mov [si],al
    inc dl
    inc si
;===========================
over:
    dec si
    mov cl,dl
    mov dl,0ah
    mov ah,2
    int 21h
;==============================
transfer3:
    add byte ptr[si],30h
    mov dl,[si]
    mov ah,2
    int 21h

    dec si
    loop transfer3
    mov ah,4ch
    int 21h
code ends
end start


;============================
该段代码的测试结果显示
当n1>n2时,且用0 填补空位,则输出结果正确

当n1<n2时,且用0 填补空位,则输出结果
例:n1=0123,n2=1234,结果显示为/8889,而8889=10000-(1234-0123)
且该规律始终不变


  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 stm32f103c8t6采集HLK-LD2450毫米波雷达传感器数据并打印显示距离和角度
    • ¥15 不重复生成字母+数字交易号
    • ¥15 AD封装导入后层混乱了
    • ¥15 如何将excel中的数据导入ansys中
    • ¥15 MATLAB中图像问题
    • ¥15 rk3399 安卓7.1 应用音频无声音
    • ¥20 Chatgpt被封号以后,换用apple和gmail注册失败,直接跳转封号界面
    • ¥15 这几个有点疑问解答一下
    • ¥15 r语言如何绘制这样的降水地图
    • ¥15 服务器一块硬盘重启过程中安装后,硬盘不识别了怎么修复?