【发布时间】:2013-12-04 18:53:21
【问题描述】:
我对基于 TASM 的汇编代码有疑问。我想将“字符串”指针中的字符串转换为十进制数,然后将其打印为十六进制数。但是,该代码仅正确打印右侧的前 2 个字符。这可能有什么问题?
concd SEGMENT
ASSUME cs: concd
ORG 100h
main:
mov ax, 0
mov bx, offset string
mov cx, 0
mov dx, 0
mov si, 0
jump:
mov cx, [bx + si]
cmp cx, 0h ;checking if we reached the end of the string
jz exit
mov dx, ax
mov cx, 9
mult:
add ax, dx ;loop for multiplying by 10
loop mult
mov cx, [bx + si]
sub cx, 30h
add ax, cx
inc si
jmp jump
exit:
call hex
mov ah, 04Ch
mov al, 0
int 21h
hex PROC
mov dx, ax
mov cl, 12
jump2:
mov ax, dx
shr ax, cl
and ax, 15
cmp ax, 9
jng t
add ax, 7h
t: add ax, 30h
call putc
sub cl, 4
jnc jump2
RET
hex ENDP
putc PROC
mov ah, 0Eh
int 10h
RET
putc ENDP
string DB "1234", 0h
concd ENDS
END main
【问题讨论】:
-
您是否验证过它正在正确地将字符串转换为十进制数?
-
你知道8086有
mul和imul指令来执行乘法吗?不需要add的循环 -
"mul" 将AX寄存器相乘的结果存储在DX和AX(32位)中,相当不方便。
-
“这很不方便” 怎么回事?无论如何,您似乎只使用了低 16 位。
-
如果 AXmul cx 将导致 dx=0 且 ax *= 10。
标签: string assembly converter tasm