|            
    功能说明:输入两组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,如果一门语言不能影响你对编程的想法,那它就不值得去学  >>>  
 |