Статус нашего сайта: |
ICQ Information Center |
ICQ SHOP 5-значные 6-значные 7-значные 8-значные 9-значные Rippers List ОПЛАТА СТАТЬИ СЕКРЕТЫ HELP CENTER OWNED LIST РОЗЫСК!New! ICQ РЕЛИЗЫ Протоколы ICQ LOL ;-) Настройка компьютера Аватарки Смайлики СОФТ Mail Checkers Bruteforces ICQTeam Soft 8thWonder Soft Other Progs ICQ Patches Miranda ICQ ФорумАрхив! ВАШ АККАУНТ ICQ LiveJournal
РекламаНаш канал:irc.icqinfo.ru |
Таненбаум Э.- Архитектура компьютера. стр.580Листинг В.7- Реализация многовариантного ветвления при помощи таблицы диспетчеризации finclude ". ./syscalnr.h" ! 1 .SECT .TEXT ! 2 jumpstrt: ! 3 PUSH strt ! 4 MOV BP.SP ! 5 PUSH _PRINTF ! 6 SYS ! 7 PUSH _GETCHAR ! 8 1: SYS ! 9 CMP AX.5 ! 10 JL 8f ! 11 CMPB AL.'0' ! 12 JL lb ! 13 CMPB AL,'9' ! 14 JLE 2f ! 15 MOVB AL,'9'+l ! 16 2: MOV BX.AX ! 17 AND BX.OXf ! 18 SAL BX.l ! 19 CALL tbl(BX) ! 20 JMP lb ! 21 8: PUSH 0 ! 22 PUSH _EXIT ! 23 SYS ! 24 routO: MOV AX.mesO ! 25 JMP 9f ! 26 routl: MOV AX.mesl ! 27 JMP 9f ! 28 rout2: MOV AX,mes2 ! 29 JMP 9f ! 30 rout3: MOV AX,mes3 ! 31 JMP 9f ! 32 rout4: MOV AX,mes4 ! 33 JMP 9f ! 34 rout5: MOV AX,mes5 ! 35 JMP 9f ! 36 rout6: MOV AX.mes6 ! 37 JMP 9f ! 38 rout7: MOV AX,mes7 ! 39 JMP 9f ! 40 rout8: MOV AX,mes8 ! 41 JMP 9f ! 42 erout: MOV AX,ernes ! 43 9: PUSH AX ! 44 PUSH _PRINTF ! 45 SYS ! 46 ADD SP.4 ! 47 RET ! 48 .SECT .DATA ! 49 tbl: .WORD routO,routl,rout2,rout3,rout4,rout5, rout6,rout7,rout8,rout8,erout ! 50 mesO: .ASCIZ "This is a zero-An" ! 51 mesl: .ASCIZ "How about a one An" ! 52 Программа начинается с вывода символьной строки, метка которой (strt) приглашает пользователя ввести восьмеричную цифру (строки 4-7 кода). Затем из файла стандартного ввода считывается символ (строки 8 и 9). Если значение АХ оказывается меньше 5, программа интерпретирует это как маркер конца файла, переходит к метке 8 в строке 22 и завершается с кодом состояния 0. Если введенный символ не является маркером конца файла, исследуется введенный символ в регистре AL. Любой символ, меньший цифры 0, считается разделителем и при переходе в строке кода 13 игнорируется; после чего извлекается следующий символ. Любой символ, больший цифры 9, считается неверным. В строке 16 он преобразуется в ASCII-символ двоеточия, который в последовательности ASCII-символов идет сразу после цифры 9. Таким образом, в строке 17 в регистре АХ находится значение в диапазоне между цифрой 0 и двоеточием. Это значение копируется в регистр ВХ. В строке 18 команда AND маскирует все биты, кроме четырех младших, в результате остается число между 0 и 10 (это связано с тем, что нулю соответствует ASCII-код 0x30). Так как в таблице мы собираемся провести индексирование слов, а не байтов, значение ВХ умножается на 2 путем сдвига влево в строке 19. В строке 20 находится команда вызова. Действительный адрес определяется прибавлением значения ВХ к численному значению метки tbl, а содержимое этого объединенного адреса загружается в счетчик команд PC. Программа выбирает одну из десяти подпрограмм в зависимости от символа, извлекаемого из стандартного ввода. Каждая из этих подпрограмм размещает в стеке адрес того или иного сообщения, а затем переходит к общему для всех вызову системной подпрограммы _PRINTF. Чтобы разобраться в происходящем, следует иметь в виду, что команды JMP и CALL загружают в регистр PC некий адрес текстового сегмента. Этот адрес представляет собой двоичное число, а в ходе ассемблирования все адреса заменяются соответствующими двоичными значениями. Двоичные значения, в свою очередь, помогают инициализировать массив в сегменте данных, что и делается в строке 50. Таким образом, массив, начинающийся с метки tbl, содержит начальные адреса подпрограмм routO, routl, rout2 и т. д., по два байта в каждом. Наличие 2-байтовых адресов объясняет необходимость в сдвиге на 1 бит, произведенном в строке 19. Таблицы такого типа часто называют таблицами диспетчеризации. |