我正在学习汇编(FreeDOS,16位),我有一个问题。
我正在尝试使用数组打印char值(以打印十六进制) 我的想法是做这样的事情:
mov bp, hexnum ; Get address of hexanum
add bp, [tab + 1] ; Add 2 to bs pointer
mov dl, [bp] ; to print '2' from hexnum
mov ah, 2
int 0x21
tab:
db 1,2,6,7 ; indexes of value to print
hexnum:
db '0','1','2' ; etc.
但是,如果我用
替换第二行add bp, 2
然后它有效。
我想我做错了什么,因为它应该打印'2',但事实并非如此。我找不到什么是错的。有人可以给我一个暗示吗?
编辑:
好吧,我设法自己解决了。这是它的样子:
mov bx, hexnum ; Get address of hexanum
add bl, [tab + 1] ; Add 2 to bs pointer
mov dl, [bx] ; to print '2' from hexnum
mov ah, 2
int 0x21
tab:
db 1,2,6,7 ; indexes of value to print
hexnum:
db '0','1','2' ; etc.
我猜是因为bx
16 位,而[tab + 1]
是 8 位。所以我必须添加到bl
而不是bx
。
答案 0 :(得分:2)
你的问题尚未解决!
您自己找到的解决方案(将标签列表中的字节添加到BL
注册表)仅有效,因为在这个小程序中所有的地址属于相同的256字节内存页面。在另一个程序中,它可能会失败,因为你没有从字节添加中获取进位。
ADC
) mov bx, hexnum
add bl, [tab + 1] ; Add 2 to bx pointer
ADC bh, 0 ;
mov dl, [bx]
mov ah, 02h
int 21h
...
tab:
db 1,2,6,7 ; indexes of value to print
hexnum:
db '0','1','2' ; etc.
DW
) mov bx, hexnum
add bx, [tab + 2] ; Add 2 to bx pointer
mov dl, [bx]
mov ah, 02h
int 21h
...
tab:
DW 1,2,6,7 ; indexes of value to print
hexnum:
db '0','1','2' ; etc.