ASM: Как влияет регистр al в следующем фрагменте

Читал книгу о микропроцессорах. Увидел этот фрагмент в коде C ++ для печати строки с использованием ASM.

str (char *string_adr[])
{
_asm
{
mov bx, string_adr
mov ah, 2
top:
mov dl, [bx]
inc bx
cmp al, 0
je bot
int 21h
jmp top
bot:
mov al, 20h
int 21h
}
}

Теперь мне было интересно, как cmp al, 0 работает с al до этого не использовался …

0

Решение

Вам нужно взглянуть на код связи proc, который генерирует компилятор. Например, он может решить поместить аргументы не только в стек, но и выбрать несколько (один?) В регистры. Но здесь, похоже, это не так: у меня сложилось впечатление, что вместо обеих ссылок на al на самом деле имелась в виду dl — в этом случае в результате конец строки (0) печатался как пробел до завершения (int 21h выглядит как MSDOS, функция 2, которая выводит символ, ASCII которого находится в dl). Это имеет некоторый смысл, поэтому я считаю, что это опечатка в примере. Я даже могу попытаться предположить, откуда могла прийти эта опечатка: в более ранней версии этого примера использовался LODSB, который является автоинкрементным косвенным регистром, считывающим предложения 8086, и целью для считываемых байтов является все , Потому что использование LODSB устарело. пример был обновлен, и косвенный регистр считывался с инкрементным инкрементом, на этот раз считывая непосредственно в dl вместо al, потому что именно там DOS fn 02 ожидает символ — к сожалению, тест конца строки пропущен, как и последующая загрузка с ASCII-символом пробела и сохраняется, как было в предыдущей версии этого примера.

0

Другие решения

Я думаю, что автор написал код от руки. Буквы «а» и «d» очень похожи в почерке, особенно когда небрежно написано:

введите описание изображения здесь
(http://en.wikipedia.org/wiki/File:Cursive.svg)

Транскрибер перепутал буквы (или не знал различных форм печатного и рукописного «а») и написал mov dl, [bx], Правильный mov al, [bx],

0

По вопросам рекламы [email protected]