#c #windows #assembly #masm
#c #Windows #сборка #masm
Вопрос:
Читал книгу о микропроцессорах. Видел этот фрагмент в коде 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
до этого он не использовался…
Ответ №1:
Вам нужно будет посмотреть на код компоновки процесса, который генерирует компилятор. Он может, например, решить поместить аргументы не только в стек, но и несколько выбранных (один?) В регистры. Но, похоже, здесь дело не в этом: у меня сложилось впечатление, что вместо обеих ссылок на al фактически подразумевалась dl — было ли это так, результатом было то, что конец строки (0) будет напечатан как символ пробела перед завершением (int 21h выглядит как MSDOS, функция 2, который выводит символ, который ASCII находится в dl). Это имеет некоторый смысл, поэтому я считаю, что это опечатка в примере. Я могу даже попытаться предложить некоторое предположение, откуда могла взяться эта опечатка: в более ранней версии этого примера использовался LODSB, который является таким же автоматически включаемым косвенным регистром, который предлагает чтение 8086, а целью для считываемых байтов является al. Поскольку использование LODSB устарело. пример был обновлен, и непрямой регистр считывается с шагом, закодированным вне, на этот раз считывается непосредственно в dl вместо al, потому что именно там DOS fn 02 ожидает символ — к сожалению, тест на конец строки был пропущен, как и более поздняя загрузка с ASCII символа пробела, и сохранен какбыло в предыдущей версии этого примера.
Комментарии:
1. Действительно, это было мое первое предположение, но последующие программы также имеют один и тот же фрагмент. Это наводит меня на мысль, что может быть что-то большее. Спасибо
Ответ №2:
Я предполагаю, что автор написал код вручную. Буквы «a» и «d» очень похожи по почерку, особенно когда они написаны неаккуратно:
(http://en.wikipedia.org/wiki/File:Cursive.svg )
Переписчик перепутал буквы (или не знал разных форм печатной и рукописной буквы «a») и написал mov dl, [bx]
. Правильно mov al, [bx]
.
Комментарии:
1. Это было приятно: D Так не думал