Если вы пытаетесь напечатать цифры, ваш код неверен.
INT 21h, AH=2
выводит ASCII-символ . То, что делает ваш код, помещает значение смещения в DL. DOS будет обрабатывать это значение смещения как символ ASCII и выводить его вместо этого.
Например, предположим, что первый ненулевой элемент имеет смещение 7. Ваш код будет вызывать INT 21h, AH=2
с DL=07
. DOS выведет символ ASCII 07h, который является BEL (в основном системный сигнал). Вместо этого вы, вероятно, захотите DL=37h
, чтобы вывести символ ASCII 37h, который представляет цифру 7.
Есть несколько способов решить эту проблему.
Первый способ прост - если ваш массив никогда не содержит более 10 элементов, вы можете просто добавить 30h к смещению, чтобы преобразовать значение смещения в правильное значение символа ASCII:
print_offsets: mov SI,0 ; SI=offset
mov CX,10 ; CX = count (must be <= 10!!!!)
offsloop: cmp 0,Array[SI]
ja print_offset ;if the array element is nonzero
next_element: inc SI
dec CX
jnz offsloop
jmp finished
print_offset: mov DL,SI
add DL, 30h ; convert offset to ASCII digit 0..9
mov AH,2
; save the registers in case INT 21h modifies them!
push cx ; save current count
push si ; save current offset
int 21h
pop si ; restore current offset
pop cx ; restore current count
jmp next_element
finished:
; do something else!
Второй способ более сложный, поскольку вам необходимо реализовать полную процедуру преобразования целочисленных значений в ascii. Но есть множество примеров кода, которые могут это сделать.