2016-06-09 4 views
0

BOOK: IBM PC ассемблер Программирование: Пятое издание Питера АбельКак это работает? Ограничитель и расширенной адресации в моей программе

Программы стр.143: Прием и отображение имен

В movzx наборах BX с числом символы, которые были напечатаны. В mov,[bx] действует как индексный регистр для облегчения расширенной адресации. MOV объединяет длину в BX с адресом KBNAME и перемещает 07H на расчетный адрес. для однойнадцатой из 11, инструкция вставляет 07H в KBNAME+11 (заменяя символ Enter) после имени. Инструкция по c10center

mov kbname[bx+1],'$' 

вставляет $ разделитель после 07H так, что int 21h функция 09H может отображать имя и звук динамик

1 c10center proc near 
2 movzx bx,actulen 
3 mov kbname[bx],07 
4 mov kbname[bx+1],'$' 
5 mov dl,actulen 
6 shr dl,1 
7 neg dl 
8 add dl,40 
9 mov dh,12 
10 call q20cursor 
11 ret 
12 c10center endp 

мой вопрос, что делает ,07 в строке 3 делать?

также я смущен, как работает линия 4? Ограничитель?

+0

Если вы просто пытаетесь научиться asm, изучение системных вызовов DOS в то же время усложняет работу IMO. Сначала вы можете изучить 32 или 64 бит, так что вы можете писать функции, которые вы можете вызывать из обычных программ. (См. [X86 tag wiki] (http://stackoverflow.com/tags/x86/info), есть несколько обучающих программ и пара ссылок с предложениями об обучении asm.). –

ответ

1

Строка 3: она помещает символ «звонок» (действительно, символ 7, это называется колокол, потому что компьютер подает звуковой сигнал при печати) в позиции, указанной bx буфера kbname. Обратите внимание, что он сначала перемещался (с нулевым расширением, поэтому я полагаю, что это своего рода 8-битное значение?) actulen в bx, потому что в 16-битном x86 это один или несколько регистров, которые могут использоваться в режимах индексированной адресации.

Линия 4 делает аналогичную вещь, но с символом $ в следующем положении в строке.

В C, эти две линий будут просто

kbname[actulen] = 7; 
kbname[actulen+1] = '$'; 

В книге рассказывается о «ограничителе», потому что int 21h/ah=09h использует $ в качестве маркеров, что строка, которую он должен показать закончилась. В этом отношении в сборке DOS программирование строк $ -terminated («ASCII $») действительно похоже на строки C NUL-terminated («ASCIIZ») (на самом деле выбор разделителя является способом глупого, поскольку $ является символом, который действительно возникает в «нормальных» строках, которые вы хотите отобразить).

+0

sir У меня вопрос в строке 4, 'mov kbname [bx + 1]', почему у bx есть плюс 1, что является его опорой на эту функцию. – Vadamadafaka

+0

Поскольку он обращается к позиции bx + 1, то есть actulen + 1. В позиции actulen он ставит символ колокола, в следующем - ограничитель строки. –

 Смежные вопросы

  • Нет связанных вопросов^_^