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

问题描述

汇编求两个任意位数的十进制数字的差,并输出。结果总是输出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)
且该规律始终不变

时间: 2024-10-25 10:44:13

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

sql-SQL 10进制转35进制 求解释

问题描述 SQL 10进制转35进制 求解释 SQL 10进制转35进制 求解释 在调查使用SQL进行10进制转35进制转化的资料时,找到如下SQL文. 经过运行确实能成转化,但小弟才疏学浅实在看不懂原理,请教各位大神帮忙解释一下 重要步骤的原理或目的. 谢谢!!!!!!! DECLARE @BASE_35 VARCHAR(100) DECLARE @BASE_10 INT SET @BASE_10 = '88' SET @BASE_35=N'' SELECT @BASE_35 = CASE W

php实现将任意进制数转换成10进制的方法_php技巧

本文实例讲述了php实现将任意进制数转换成10进制的方法.分享给大家供大家参考.具体如下: php将任意进制的数转换成10进制,例如8进制转换成10进制,16进制转换成10进制 <?php # Show the steps involved in converting a number # from any base (like octal or hex) to base 10 # See below for examples, instructions and copyright functi

acm icpc-一个c语言的简单acm问题,求两个二进制数有多少位不同,输入的是十进制数.

问题描述 一个c语言的简单acm问题,求两个二进制数有多少位不同,输入的是十进制数. include int main() { int n,p=0,k,m,t; int a[50]; int b[50]; int c[50]; int d[50]; int i=0,j,u,z,w,q,e,s; int r; int count=0; scanf("%d",&r); while(r--){ scanf("%d%d",&n,&m); while(

php实现的任意进制互转类分享_php实例

之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个.... <?php /** * 进制转换类 * @author sgf@funcity * @version 2011-02-15 */ Class Hex{ private static $element = array( '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J', 'K','L','M'

c++acm问题-c++题的一道题求两1000位数以内的和

问题描述 c++题的一道题求两1000位数以内的和 不知道为什么AC不了 ![CSDN移动问答][1] [1]: http://acm.hdu.edu.cn/showproblem.php?pid=1002 这是问题要求 这是我的代码 用的是vs2012#include using namespace std; int main( ){ int t; cin>>t; for (int i=1;i<=t;i++) { char a[1001]b[1001]c[1003]; cin>&

进制之间的转换-输入为“任意进制+数值”,想输出十进制下该数的数值,但怎么也输出不对,求解答!

问题描述 输入为"任意进制+数值",想输出十进制下该数的数值,但怎么也输出不对,求解答! int main() { int i=0,j,k,s=0,d=0,n=0; int q=1; int a,b; char str1[100]; char str2[100]; int num[100]; cin>>i; gets(str1); k=strlen(str1)-2; while(k>=0) { a=getnum(str1[k]); a=a*q; s=s+a; q=q*

visual studio-VS2015求两数和没法输入数?

问题描述 VS2015求两数和没法输入数? 输入任意键直接退出 没法输入数? 解决方案 cin>>V1>>V2 应该分开 解决方案二: 你单步调试一下,看有没有到最后,或者在main函数退出前加上"system("pause"):",程序就不会退出了. 还有你两个数是怎么输入的,中间是空格么?还是输入一个,回车一下,再输入下一个?

oracle 求两个时间点直接的分钟、小时数

select sum(ceil((gdr.enddt - gdr.startdt) * 24)) h, sum(ceil((gdr.enddt - gdr.startdt) * 24 * 60)) m, sum(ceil((gdr.enddt - gdr.startdt) * 24 * 60 * 60)) s from gat_data_record gdr where gdr.enddt between to_date('2011-1-1','yyyy-mm-dd') and to_date(

如何求两个数组的交集

题目意思大概是这样的:给定两个大数组(1w以上1亿以下),用最有效的方法找出来两个数组的交集. 对于这道题,我有一个思路就是,先对数组进行排序,然后用两个指针在已排序的数组上轮流指向头结点,进行比较. 比较亮的地方,就是在于这个比较的方式了. 首先,比较的时候,要先确定两个指针指向的内用是否一致.如果一致,那么这个点,就是交集的一个元素,没问题吧? 这里有一个问题就是,接下来如何比较? 步骤是这样的:先比较两个指针指向内容的大小,指向结果小的指针,开始递增,直到较小的指针指向的值大于或等于另一个