编程语言

img hongweijin

汇编中的不同进制的输入与输出操作

发表于2004/10/27 23:59:00  1988人阅读

从键盘上接受两个4位十六进制数,在下一行以二进制形式输出两数的异或的结果。并将此二进制数的结果中的第3到第0与第15位到第12位对调,再以十六进制输出!
终于自己搞定了。论坛里问不出这样的程序啊!



算法简介:
        实现这样的输入和输出,关键是要注意ASCII码(非压缩的BCD码)和压缩的BCD的转换。
        输入十六进制数:
                十六进制数包括a'b'c'd'e'f(为了输入方便用小写来表示),由与采用的是1号调用,所以是使用一个字符的输入。
                这样我要设置8个变量去接受共8位的十六进制数。当然对接受到的字符要进行转换为压缩的BCD码,集体的以下面的代 码为实例:
       mov ah, 1;进行1号调用
       int 21h
       mov ah, 'a';先进行寄存
       ;实现不同的选择
       cmp ah, al
       jna  Fun14
       jnc  Fun15
      
  Fun14:sub al, 57h;这里和小写的a相对应,如a的ASCII码值是61h减调57h就是10(a)
       jnc  NEXT2
  Fun15:sub al, 30h
 NEXT2:
       mov c, al ;最后存储结果

接受完毕接下来是异或运算:
         异或运算:
                由于我们刚才的接受的一个个的位,那我们也就可以一个个位的交叉进行xor运算。将结果保存在变量中以遍输出十六进制时使用。
        二进制输出,就是模拟除二取余的过程,不过要每次将结果保存好,因为最开始得到的结果,最后输出。实例代码:
        mov dl, l;一个运算的结果
       add dl, 30h;转换为ACSII输出(1或者是0)
       ;模拟除2取余的方法
       mov ah, 2
       int 21h
       mov dl, k
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, j
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, i
       add dl, 30h
       mov ah, 2
       int 21h

        调换也就更简单,就是把上步得到的第一个变量和第四个变量调换输出就行了。实例代码:
       mov al, p;p是寄存四位二进制位的异或结果的变量
       mov ah, 10;这里为什么没有57h可以思考一下,其实也很容易理解的
       cmp ah, al
       jna  Func0
       jnc  Func1
      
  Func0:add al, 57h
       jnc  NEXTC0
  Func1:add al, 30h
 NEXTC0:mov dl, al
       mov ah, 2
       int 21h


;具体代码:

data segment
       newline db 0dh, 0ah, '$'
       top1    db 'the first word(minuscule):', '$'
       top2    db 'the second word(minuscule):', '$'
       ;the first word:abcd
       a db ?
       b db ?
       c db ?
       d db ?
       ;the second word:efgk
       e db ?
       f db ?
       g db ?
       h db ?
       ;the temp varivable
       i db ?
       j db ?
       k db ?
       l db ?
       ;save the xor result
       m db ?
       n db ?
       o db ?
       p db ?
data ends

code segment
assume cs:code, ds:data
start: mov ax , data
       mov ds , ax
       ;**************top1
       mov dx, offset top1
       mov ah, 9
       int 21h
       ;***********enter a
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun0
       jnc  Fun1
      
  Fun0:sub al, 57h
       jnc  NEXT0
  Fun1:sub al, 30h
 NEXT0:mov a, al
       ;***********enter b
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun2
       jnc  Fun3
      
  Fun2:sub al, 57h
       jnc  NEXT1
  Fun3:sub al, 30h
 NEXT1:mov b, al
       ;***********enter c
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun14
       jnc  Fun15
      
  Fun14:sub al, 57h
       jnc  NEXT2
  Fun15:sub al, 30h
 NEXT2:
       mov c, al
       ;***********enter d
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun4
       jnc  Fun5
      
  Fun4:sub al, 57h
       jnc  NEXT3
  Fun5:sub al, 30h
 NEXT3:
       mov d, al
       ;**************newline
       mov dx, offset newline
       mov ah, 9
       int 21h
       ;**************top2
       mov dx, offset top2
       mov ah, 9
       int 21h
       ;***********enter e
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun6
       jnc  Fun7
      
  Fun6:sub al, 57h
       jnc  NEXT4
  Fun7:sub al, 30h
 NEXT4:
       mov e, al
       ;***********enter f
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun8
       jnc  Fun9
      
  Fun8:sub al, 57h
       jnc  NEXT5
  Fun9:sub al, 30h
 NEXT5:
       mov f, al
       ;***********enter g
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun10
       jnc  Fun11
      
  Fun10:sub al, 57h
       jnc  NEXT6
  Fun11:sub al, 30h
 NEXT6:
       mov g, al
       ;***********enter h
       mov ah, 1
       int 21h
       mov ah, 'a'
       cmp ah, al
       jna  Fun12
       jnc  Fun13
      
  Fun12:sub al, 57h
       jnc  NEXT7
  Fun13:sub al, 30h
 NEXT7:
       mov h, al
       ;**********the newline
       mov dl, offset newline
       mov ah, 9
       int 21h
       ;******xor function
       mov al, a
       mov bl, e
       xor al, bl
       mov m, al   
       mov bl, 2
       ;****enhance the ah
       mov ah, 0
       div bl
       mov i, ah
       ;****can use the for
       mov ah, 0
       div bl
       mov j, ah
       mov ah, 0
       div bl
       mov k, ah
       mov l, al
       ;pirnt (a xor e) the binary
       mov dl, l
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, k
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, j
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, i
       add dl, 30h
       mov ah, 2
       int 21h
      
       ;******xor function
       mov al, b
       mov bl, f
       xor al, bl
       mov n, al   
       mov bl, 2
       ;****enhance the ah
       mov ah, 0
       div bl
       mov i, ah
       ;****can use the for
       mov ah, 0
       div bl
       mov j, ah
       mov ah, 0
       div bl
       mov k, ah
       mov l, al
       ;pirnt (a xor e) the binary
       mov dl, l
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, k
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, j
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, i
       add dl, 30h
       mov ah, 2
       int 21h
      
       ;******xor function
       mov al, c
       mov bl, g
       xor al, bl
       mov o, al   
       mov bl, 2
       ;****enhance the ah
       mov ah, 0
       div bl
       mov i, ah
       ;****can use the for
       mov ah, 0
       div bl
       mov j, ah
       mov ah, 0
       div bl
       mov k, ah
       mov l, al
       ;pirnt (a xor e) the binary
       mov dl, l
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, k
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, j
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, i
       add dl, 30h
       mov ah, 2
       int 21h
      
       ;******xor function
       mov al, d
       mov bl, h
       xor al, bl
       mov p, al  
       mov bl, 2
       ;****enhance the ah
       mov ah, 0
       div bl
       mov i, ah
       ;****can use the for
       mov ah, 0
       div bl
       mov j, ah
       mov ah, 0
       div bl
       mov k, ah
       mov l, al
       ;pirnt (a xor e) the binary
       mov dl, l
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, k
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, j
       add dl, 30h
       mov ah, 2
       int 21h
       mov dl, i
       add dl, 30h
       mov ah, 2
       int 21h
       ;**************newline
       mov dl, offset newline
       mov ah, 9
       int 21h
       ;print the 0X result 'pnom'
       mov al, p
       mov ah, 10
       cmp ah, al
       jna  Func0
       jnc  Func1
      
  Func0:add al, 57h
       jnc  NEXTC0
  Func1:add al, 30h
 NEXTC0:mov dl, al
       mov ah, 2
       int 21h
      
       mov al, n
       mov ah, 10
       cmp ah, al
       jna  Func2
       jnc  Func3
      
  Func2:add al, 57h
       jnc  NEXTC1
  Func3:add al, 30h
 NEXTC1:mov dl, al
       mov ah, 2
       int 21h
      
       mov al, o
       mov ah, 10
       cmp ah, al
       jna  Func4
       jnc  Func5
      
  Func4:add al, 57h
       jnc  NEXTC2
  Func5:add al, 30h
 NEXTC2:mov dl, al
       mov ah, 2
       int 21h
      
       mov al, m
       mov ah, 10
       cmp ah, al
       jna  Func6
       jnc  Func7
      
  Func6:add al, 57h
       jnc  NEXTC3
  Func7:add al, 30h
 NEXTC3:mov dl, al
       mov ah, 2
       int 21h
       ;*******move to dos
       mov ah, 4ch
       int 21h
code ends
end  start



利用循环来做,若要使处理的数据,不限制在4位可以修改相应的地方,如有4的地方就应该先考虑!



data segment
 stringn db 5
 stringl db ?
 string  db 4 dup(?), 0dh, 0ah, '$'
 stringn2 db 5
 stringl2 db ?
 string2  db 4 dup(?), 0dh, 0ah, '$'
 result  db 4 dup(?), 0dh, 0ah, '$'
 message1 db 'please input first number:',0dh,0ah,'$'
 message2 db 'please input second number:',0dh,0ah,'$'
 newline  db 0dh,0ah,'$'
 N        dw ?
data ends

code segment
assume cs:code, ds:data
start: mov ax, data
       mov ds, ax
       ;得到第一个字符串提示
       lea dx, message1
       mov ah, 09h
       int 21h
       ;得到第一个字符串
       lea dx, stringn
       mov ah, 0ah
       int 21h
       mov cl, stringl
       mov ch, 0
       ;屏幕换行
       lea dx, newline
       mov ah, 09h
       int 21h
       ;得到第一个字符串提示
       lea dx, message2
       mov ah, 09h
       int 21h
       ;得到第一个字符串
       lea dx, stringn2
       mov ah, 0ah
       int 21h
       ;因为接受的是非压缩的BCD码
       ;所以要---转换
       mov cx, 4
 loop1:
       mov al, 4
       sub al, cl
       mov ah, 0
       mov si, ax
       cmp string[si], '0'
       jb  other
       cmp string[si], '9'
       ja  other
       sub string[si], 30h
       jmp next0
 other:
       sub string[si], 37h
 next0:
       loop loop1
       ;转换第二个字符串
       mov cx, 4
 loop2:
       mov al, 4
       sub al, cl
       mov ah, 0
       mov si, ax
       cmp string2[si], '0'
       jb  other1
       cmp string2[si], '9'
       ja  other1
       sub string2[si], 30h
       jmp next1
 other1:
       sub string2[si], 37h
 next1:
       loop loop2
       ;转换完成后,求异或
       mov cx, 4
 loop3:
       mov si, cx
       mov al, string[si - 1]
       mov bl, string2[si - 1]
       xor al, bl
       mov result[si - 1], al
       loop loop3
       ;换行输出
       lea dx, newline
       mov ah, 09h
       int 21h
       ;异或完成输出二进制的结果
       mov cx, 4
loop4:
       mov al, 4
       sub al, cl
       mov ah, 0
       mov si, ax
       mov al, result[si]
Next2:
       mov ah, 0
       mov bl, 2
       div bl
       cmp al, 2
       mov bl, ah
       mov bh, 0    
       push bx
       inc N
       jb  Print
       jmp Next2      
Print: mov ah, 0
       push ax
       inc N
       mov bx, cx
       ;对N进行处理
       ;N若不是4则前面压入0
       cmp N, 4
       jz NextN
       mov cx, 4
       sub cx, N
 loopN:
       push 0
       loop loopN 
 NextN:     
       mov cx, 4
 NextB:pop dx
       add dx, 30h
       mov ah, 2
       int 21h
       loop NextB
       ;为下一个数初始
       mov cx, bx
       mov N, 0
       loop loop4
       ;将第3到第0与第
       ;15位到第12位对调
       mov si, 0
       mov al, result[si]
       mov si, 3
       mov ah, result[si]
       mov result[si], al
       mov si, 0
       mov result[si], ah
       ;换行输出
       lea dx, newline
       mov ah, 09h
       int 21h
       ;将结果HEX输出,过程
       ;和二进制输出一样
       mov cx, 4
loop5:
       mov al, 4
       sub al, cl
       mov ah, 0
       mov si, ax
       mov al, result[si]
       cmp al, 9
       jg  hexpri;大于9时,跳转
       mov dl, al
       add dl, 30h
       mov ah, 2
       int 21h
       jmp jmplp
hexpri:
       mov dl, al
       add dl, 37h
       mov ah, 2
       int 21h
jmplp: loop loop5
      
       mov ah, 4ch
       int 21h
code ends
end  start

阅读全文
0 0

相关文章推荐

img
取 消
img