MASM-两个16位二进制数减法模拟

功能说明:输入两组16位二进制代码模拟两为16位二进制整数,对其求差并以16进制输出.

基本算法:采用补码,模拟二机制减法(加法类同),得到差(补码)转换成原码后,转化成十六进制并输出.16为二进制转换成4为十六进制数的方法是采用:将16位二进制分成4组,每组由连续4位二进制组成,模拟4位二进制到一位十六进制转换,将每组转换成16进制数并输出.详见代码

本代码在MASM.5调试通过

运行界面:

binary(YuanMa) num1=1000000000001011 ;被减数原码
binary(YuanMa) num2=1000000000001101 ;减数原码
binary(Buma) num1 BM=1111111111110101 ;被减数补码
binary(Buma) num2 BM=1111111111110011 ;减数补码
binary(Buma) diff sub=0000000000000010 ;差补码
binary(YuanMa)diffsub=0000000000000010 ;差原码
hex sumHEX=0002
;/************************************************/
;
;bsub.asm
;hbyufan@163.com
;
TSOUT MACRO dx0
    mov ah,09h
    mov dx,offset dx0
    int 21h
ENDM
data segment
num1 db 19 dup(''$'')
num2 db 19 dup(''$'')
sum db 19 dup(''$'')
hexsum db 5 dup(''$'')
tsnum1 db 0ah,0dh,''binary(YuanMa) num1=$''
tsnum2 db 0ah,0dh,''binary(YuanMa) num2=$''
tssum db 0ah,0dh,''binary(Buma) diff sub=$''
tsnum11 db 0ah,0dh,''binary(Buma) num1 BM=$''
tsnum22 db 0ah,0dh,''binary(Buma) num2 BM=$''
tssum33 db 0ah,0dh,''binary(YuanMa)diffsub=$''
tssumhex db 0ah,0dh,''hex sumHEX=$''
data ends
code segment
   assume ds:data,cs:code
start:
    mov ax,data
    mov ds,ax
re:
   TSOUT tsnum1
    mov si,0
n1roat:
    mov ah,01h
    int 21h
    cmp al,''0'' ;对NUM1输入错误简单处理---重新输入
    jl re
    cmp al,''1''
    ja re
    mov num1[si],al
    inc si
    cmp si,16
    jl n1roat
re2:
    TSOUT tsnum2
    mov si,0
n2roat:
    mov ah,01h
    int 21h
    cmp al,''0'' ;对NUM1输入错误简单处理---重新输入
    jl re2
    cmp al,''1''
    ja re2
    mov num2[si],al
    inc si
    cmp si,16
    jl n2roat
    mov bx,offset num1
    call questBuma
    mov bx,offset num2
    call questBuma
        TSOUT tsnum11;//
        TSOUT num1;//
        TSOUT tsnum22;//
        TSOUT num2;//
    call bsubproc
        TSOUT tssum;   
        TSOUT sum ;//test
    lea bx,sum
    call questBuma
        TSOUT tssum33;//
        TSOUT sum;//
    lea bx,sum
    call BinaryToHexAndOut
        TSOUT tssumhex;//
        TSOUT hexsum;//
;******************************
    mov ah,4ch
    int 21h
;*******************************************
questBuma proc near ;功能:求补码
  ;算法:模拟求补码运算,如二进制求补码方法一致.
         ;bx  ;bx作为参数,传入NUM1或NUM2内存空间首地址
    mov al,[bx+0]
    cmp al,''0''
    jz qbret ;如果是正整数,函数返回;如果是负数,符号位不变,其余位取反加1.
    mov si,1 
qbroat:
    mov al,[bx][si]
    cmp al,''0''
    jz qb1
    mov al,''0''
    mov [bx][si],al
    jmp qb2
qb1:
    mov al,''1''
    mov [bx][si],al
qb2:
    inc si
    cmp si,16
    jl qbroat
qnext:  
    mov dh,1   ;加1处理.方法类似减法
    mov si,15
qbincre:
    mov al,[bx][si]
    sub al,''0''
    add al,dh
    mov dh,0
    cmp al,2
    jnz qbi1
    mov al,0
    mov dh,1
qbi1:
    add al,''0''
    mov [bx][si],al
    dec si
    cmp si,0
    jnl qbincre
qbret:
    ret
questBuma endp
;*******************************************
bsubproc proc near ;功能:16位二进制数减法模拟.
  ;算法:逐位相减,flag为借位标志(BX)
    push ax
    push bx
    push cx
    push si
    mov bx,0 ;//flag
    mov si,15
broat: mov al,num1[si]
    add al,bh
    mov bh,0 ;//clear bh
    cmp al,num2[si]
    jnl bnext
    add al,2
    dec bh
bnext: 
    sub al,num2[si]
    add al,''0''
    mov sum[si],al
    dec si
    cmp si,0
    jnl broat  
    pop si
    pop cx
    pop bx
    pop ax
    ret
bsubproc endp
;*******************************************
BinaryToHexAndOut proc near ;功能如函数名
        ;bx ;bx作为参数,传入NUM1或NUM2内存空间首地址
    mov dh,2
    mov si,0
bth1:
    mov al,0 ;分组转换,模拟4为二进制到1为16进制数的转换
    mov di,0
bth2:  
    mul dh
    add al,[bx][di]
    sub al,''0''
    inc di
    cmp di,4
    jl bth2
    cmp al,9
    jna bth3
    sub al,10
    add al,''A''
    jmp bth4
bth3:
    add al,''0''
bth4:
    mov hexsum[si],al
    inc si
    add bx,4
    cmp si,4
    jl bth1
    ret
BinaryToHexAndOut endp
;*******************************************
code ends
    end start

<<<<

学习箴言:

1,一知半解是危险的

2,如果一门语言不能影响你对编程的想法,那它就不值得去学

>>>

时间: 2024-10-31 19:28:36

MASM-两个16位二进制数减法模拟的相关文章

编程-汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数

问题描述 汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数 汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数.转换算法可以是:用二进制数除以10000,商为"万位",再用余数除以1000,得到"千位":依次用余数除以100.10和1,得到"百位"."十位"和"个位" 解决方案 unsigned int ui;//(16位无符号二进制数) unsigned

一个php生成16位随机数的代码(两种方法)_php技巧

分享一个php生成16位随机数的代码,php生成随机数的二种方法. 方法1 复制代码 代码如下: <?php $a = mt_rand(10000000,99999999); $b = mt_rand(10000000,99999999); echo $a.$b; 方法2: <?php $a = range(0,9); for($i=0;$i<16;$i++){ $b[] = array_rand($a); } // www.yuju100.com var_dump(join("

财富公布全球50位最伟大领袖:中国两人入选 马云第16位

财富公布全球 50位最伟大领袖中新社纽约3月20日电(记者 阮煜琳)美国著名财经杂志<财富>20日公布了"全球50位最伟大领袖"排名,教皇方济各荣登排行榜榜首,中国阿里巴巴集团执行董事长马云排在第16位.公布的资料显示,2013年3月,在梵蒂冈西斯廷教堂顶 端的烟囱冒出白烟1小时后,76岁的教皇方济各出现在圣彼得大教堂阳台中央,标志着他成为全世界12亿天主教徒的领导者.教宗上任一年来,通过对教会的改革,吸引了大批非天主教崇拜者.<财富>杂志赞扬教宗以谦逊和包容,

先知创新大会:16位华人安全科学家分享前沿研究,中国密码专家王小云获先知奖

11月17日 – 18日,首届先知创新大会在京召开,16位量子技术.信息安全与风控.机器学习.人工智能领域的技术"领军人",分享其最新的研究成果.   其中包括量子技术界重量级人物施尧耘,清华大学"杨振宁讲座教授".中国密码学家王小云,清华大学网络与信息安全实验室主任段海新,浙江大学"千人计划"学者徐文渊等学术研究者:也有来自阿里巴巴.蚂蚁金服.百度.腾讯和360等企业和研究所的产业界专家.  "先知创新大会是一个开放,中立,包容的技术

使用GCC和GNU Binutils编写能在x86实模式运行的16位代码

使用GCC和GNU Binutils编写能在x86实模式运行的16位代码 不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解GCC生成16位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在x86实模式下运行的16位代码,这个话题确实有点复古,所以能找到的资料也相应较少.要运行x86实模式的程序,目 前我知道的只有两种方式,一种是使用DOS系统,另一种是把它写成引导扇区的代码,在系统启动时直接运行.很显然,许多讲自己实现操作系统的书籍都会讲到

我用3DES加密后怎么样才能得到16位的密文

问题描述 明文:12345678秘钥:12345678909876543212345678909876进过计算出来的密文:iGNoZSrV2gnYK7x4ogdzdQ==我现在想让这个密文显示成由0到9,A到F里面的数组成的16位的密文.求解应该怎么弄.最好有代码谢谢各位啦! 解决方案 解决方案二:急求,在线等解决方案三:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Security.Crypto

XPwn黑客破解秀,16位网红见证黑掉小米

    作为国内黑客大会的始祖 XCon,今年已经是第15届,与往届不同的是,本届XCon首次插入了黑客破解秀XPwn,并邀请了16位网络主播网红妹子对破解秀进行直播,让XPwn不仅台上精彩不断,台下也十分惊艳. 首届XPwn的开场秀是小米智能家居硬件的破解.白帽子黑客在台上向大家进行了对无线智能Wi-Fi插头与小米家庭通用网关的真实破解演示.这两款产品分别可以通过手机App对家里电插板以及网络进行开关控制.现场,白帽子黑客通过对这两个设备强制安装一个恶意固件的方式,让这两款产品可以自动对自己发

请问各位大侠,16位小数的时间戳怎么生成的?谢谢 在线等

问题描述 请问各位大侠,16位小数的时间戳怎么生成的?谢谢!例如:temp=0.03739706882591959,temp=0.5019163067261818,这个不是随机数,是时间 解决方案 解决方案二:看不懂这是什么时间?微秒吗?解决方案三:引用1楼shingoscar的回复: 看不懂这是什么时间?微秒吗? 应该是精准到微妙的解决方案四:DateTime.Now.ToOADate()解决方案五:引用3楼shingoscar的回复: DateTime.Now.ToOADate() 这个不对

16位计数器之元件例化的学习

16位全加器          通过该实验,学习元件例化. 1个16位全加器由4个4位全加器构成: 1个4位全加器由4个1位全加器构成: 1位全加器由两个半加器加上一个或门构成: 一个半加器由门级电路构成. 如下图: 顶层文件: 第二层:1个16位全加器由4个4位全加器构成: 第三层:1个4位全加器由4个1位全加器构成: 第四层:1位全加器由两个半加器加上一个或门构成: 第五层:一个半加器由门级电路构成 A B Sum C_out 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1