Сборка: Как напечатать значения смещения - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь распечатать значения смещения. (Является ли термин «печать» правильным? Есть ли другой термин для этого?

Код правильный? Я довольно запутался с документацией для сборки.

print_offsets:  mov  SI,0
                mov  CX,30
                mov  AH,2
                int  21h
                jmp  offsloop

offsloop:       cmp  0,Array[SI]
                ja   print_offset ;if the array element is nonzero
                inc  SI
                dec  CX
                jnz  offsloop

print_offset:   mov DL,SI
                mov  AH,2
                int  21h

1 Ответ

0 голосов
/ 24 февраля 2012

Если вы пытаетесь напечатать цифры, ваш код неверен.

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. Но есть множество примеров кода, которые могут это сделать.

...