从键盘上接受两个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