assume cs:code,ds:data
data segment
dw 10 dup (0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov bx,0
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov dx,0
mov cx,10
div cx;此时ax为被除数的低位,dx为高位,cx为除数,执行后,ax存商,dx存余数
mov cx,ax
add dx,30h
mov ds:[si],dl
add si,1
jcxz change
add bx,1
jmp dtoc
show_str: mov si,0
mov ax,0b800h
add dl,dl
sub dl,2
mov bx,0ah
sub dh,1
mov cl,dh
mov ch,0
s:add ax,bx
loop s
mov es,ax;es现在是第八行的段地址
mov dh,0
mov di,dx
s1: mov cl,[si]
mov ch,0
jcxz ok
mov al,[si]
mov es:[di],al
mov cl,2
mov byte ptr es:1[di],cl
add di,2
inc si
jmp s1
change:mov ax,bx
mov cl,2
div cl
mov cl,al
mov ch,0
mov si,0
cc: mov al,[si]
mov ah,[si+bx]
mov [si+bx],al
mov [si],ah
add si,1
sub bx,2
loop cc
jmp ok
ok:ret
code ends
end start
执行结果
上述代码板块分的很明确,而且对上一个show-str子程序作了很大的优化,子程序的独立性变的很强。注意下,按照余数输入ds中的顺序是逆序,所以要用change来交换次序。由于dw型数据最大为十进制5位,所以实际上最大交换次数为2。
将cx设置为si的一半,也就是最大处偏移地址的一半。这样就实现了交换次序。
而后调用show-str,就可以按照要求输出了。
代码比较精简,也比较易读,各程序之间耦合度很高