NASM / DOS - 使用int数组中的值并将其添加到指针

时间:2018-04-04 19:32:50

标签: assembly hex nasm dos

我正在学习汇编(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

1 个答案:

答案 0 :(得分:2)

你的问题尚未解决!

您自己找到的解决方案(将标签列表中的字节添加到BL注册表)有效,因为在这个小程序中所有的地址属于相同的256字节内存页面。在另一个程序中,它可能会失败,因为你没有从字节添加中获取进位。

解决方案1选取进位(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.

解决方案2将偏移定义为单词(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.