【发布时间】:2017-03-24 07:06:15
【问题描述】:
组装,masm
嘿,我写了一个宏,它打印存储在 dane1 段中的 1 字节值。
我将该值除以 16,然后将提醒推送到堆栈,直到 value==0。然后我弹出提醒将它们转换为 ASCII 码,然后打印出来。
有人看我的代码吗?我应该改变什么以使其更简单?
我不想每次都这样做:
mov dl,67h
mov ds:[v1],dl
print v1
是否可以修改这个宏,以便它可以使用它:
print 67h
print al
感谢您的帮助。
assume cs:code1
.186
dane1 segment
v1 dw 0D9h ;to use macro
dane1 ends
print macro value
pusha
mov ax,seg value
mov ds,ax
mov ax,ds:[value]
xor cx,cx ;CX - repetitions
analyse: ;pushes the digits into stack
mov dl,16 ;divisor
div dl ;divide number in AX by 16
xor dx,dx
mov dl,ah ;remainder into the stack
push dx
xor ah,ah ; prepare quotient for next loop
inc cx ;increase repetitions
cmp ax,0 ;break condition
jne analyse
begin1: ;print character stored in the stack
pop dx ;pop to DL
cmp dl,10d ;is DL digit or char
jb digit
char: ;convert to ASCII
add dl,55
jmp begin2
digit:
add dl,'0'
jmp begin2
begin2:
mov ah,2 ;print character converted to ASCII
int 21h
loop begin1
popa
endm
code1 segment
start1: mov ax,seg top1
mov ss,ax
mov sp,offset top1
print v1
mov ah,4ch
int 21h
code1 ends
stos1 segment stack
dw 200 dup(?)
top1 dw ?
stos1 ends
end start1
【问题讨论】:
-
为什么不使用寄存器来打印值?
-
div 很慢。 AX / 16 的提醒,例如可以用
AND AX,0Fh计算,结果是SHR AX,4 -
如果你只想显示字节值,你的十六进制数字总是最多只有 2 位