Форматы машинных команд Формат определяет правила кодирования машинных команд 7 1 0 7 6 5 4 3 2 1 0 КОП d w mod reg r/m 0 7 7 Disp L Общий формат двухоперандной команды MOV AX, BX SUB AL, AX MOV BL, BH 0 Disp H Передача или операция d w 0 0 Байт из регистра reg в память или регистр r/m 0 1 Слово из регистра reg в память или регистр r/m 1 0 Байт в регистр reg из памяти или регистра r/m 1 1 Слово в регистр reg из памяти или регистра r/m Таблица 1 reg, r/m w=0 w=1 000 AL AX 001 CL CX 010 DL DX 011 BL BX 100 AH SP 101 CH BP 110 DH SI 111 BH DI mod 00, disp = 0 – смещение отсутствует 01, disp=disp L – используется 8-битовое смещение, которое расширяется со знаком до 16 бит; 10, disp=disp H – используется 16-битовое смещение; 11, регистровая адресация в соответствии с таблицей 1. r/m Эффективный адрес способ адресации 000 EA=(BX)+(SI)+disp Базово-индексная 001 EA=(BX)+(DI)+disp 010 EA=(BP)+(SI)+disp 011 EA=(BP)+(DI)+disp 100 EA=(SI)+disp 101 EA=(DI)+disp 110 EA=(BP)+disp 111 EA=(BX)+disp Индексная Базовая Вычисление физического адреса операндов в памяти КОП s w mod КОП r/m Disp L Disp H Data L Data H Двухоперандная команда с непосредственным операндом MOV AX, Gamma MOV BL, 10000111b ADD CX, 0FFFEh sw Размер операнда X0 Один байт данных data L 01 Два байта (word)data H, data L 11 Один байт данных, который расширяется со знаком до 16 бит w mod КОП r/m КОП Disp L Disp H Формат однооперандной команды 1100011 w 1011 w reg mod 000 r/m Data L Data L Data H Data H Стандартный и укороченный формат команд непосредственной передачи данных Режимы адресации Способы определения адресов операндов в командах называются режимами адресации Регистровая адресация MOV AX, BX XOR BL, AL DEC SI ; переслать содержимое регистра BX в регистр AX. ; сложить по модулю два содержимое регистров BL и AL. ; увеличить на 1 содержимое регистра SI. Непосредственная адресация MOV CH, 3Eh MOV AL, 10000000b CMP [SI], 0FFh MOV DX, offset TEXT ;загрузить регистр CH байтом 3Еh ;создать в AL маску с 1 в старшем бите ;сравнить содержимое ячейки памяти числом FFh ;переслать регистр DX смещение переменной TEXT Прямая адресация к памяти MOV AX, GAMMA SUB TEMP, BL ;переслать в регистр AX переменную GAMMA ;вычесть из переменной TEMP содержимое регистра BL Косвенная регистровая адресация (базовая и индексная) ADD AX, [DI] MOV [SI], BL CMP byte ptr [BX], 100d ;сложить содержимое регистра АХ и ячейки памяти, ;адресуемой через регистр DI. ;переслать содержимое ВL в память ;по адресу, находящемуся в SI. ;сравнить содержимое ячейки памяти ;с адресом в ВХ с числом 100. Косвенная регистровая адресация со смещением (базовая и индексная со смещением) ARRAY DB 20 DUP (‘@’); создать массив из 20 символов LEA SI, ARRAY MOV AL, [SI + 9] ADD [SI] 5, 0Fh MOV 8 [SI], AH ;загрузить в SI начальный адрес массива ARRAY. ;переслать девятый элемент массива в регистр AL. ;сложить пятый элемент массива с числом Fh. ;переслать содержимое AH в восьмой ;элемент массива MOV SI, 0 MOV AL, ARRAY [SI + 9] ADD ARRAY [SI] 5, 0Fh MOV ARRAY 8 [SI], AH ;основная программа PUSH DS PUSH ES PUSH SI CALL ROUTE ;подпрограмма ROUTE MOV BP, SP MOV AX, 2 [BP] MOV BX, 4 [BP] MOV CX, 6 [BP] ;загрузить в SI индекс начального элемента массива ;ARRAY. ;переслать девятый элемент массива в регистр AL. ;сложить пятый элемент массива с числом Fh. ;переслать содержимое AH в восьмой ;элемент массива ;сохранить в стеке содержимое трех ;регистров DS, ES, SI, через которые ;передаются параметры подпрограмме. ;вызов подпрограммы. ;загрузить в BP адрес входа в стек. ;извлечь из стека содержимое SI. ;извлечь из стека содержимое ES. ;извлечь из стека содержимое DS. Базово-индексная адресация эффективный адрес ЕА вычисляется как сумма содержимого двух регистров (базового и индексного), указанных в команде. При этом могут использоваться следующие пары регистров: [BX] [SI] – адрес вычисляется как DS: [BX] [SI]; [BX] [DI] – адрес вычисляется как DS: [BX] [DI]; [BP] [SI] – адрес вычисляется как SS: [BP] [SI]; [BP] [DI] – адрес вычисляется как SS: [BP] [DI]. Базово-индексная адресация со смещением эффективный адрес ЕА вычисляется как сумма содержимого двух регистров (базового и индексного) и смещения, указанного в команде Пусть в сегменте данных создан массив из 20 символов (по 10 в строке): MAS DB ‘QWERTYUIOP’ DB ‘ЙЦУКЕНГШЩЗ’ MOV BX, 10 ;загрузить в ВХ число байт в строке. MOV SI, 4 ;загрузить в SI индекс 5-го элемента второй строки. MOV AL, MAS [BX] [SI] ;переслать 5-й элемент второй ;строки в AL. LEA BX, MAS MOV SI, 4 MOV AL, [BX+10] [SI] ;загрузить в ВХ начальный ;адрес массива ;загрузить в SI индекс 5-го ;элемента второй строки. ;переслать 5-й элемент второй ;строки в AL. Вычисление физического адреса памяти SEG : EA – логический адрес ячеек памяти PA = SEG*16 + EA – физический адрес ячеек памяти BX CS BP SS SI DS DI ES Смещение disp EA Физ. адрес Эффективный адрес BX+SI+disp BX+DI+disp BP+SI+disp BP+DI+disp Адресация Базовоиндексная (со смещением) Индексная SI+disp DI+disp (со смещением) BP+disp BX+disp (со смещением) Базовая Формирование эффективного адреса операнда Относительная адресация КОП Disp 15 0 + IP Относительная адресация JMP Start_1 ; перейти на метку Start_1 Неявная адресация CBW; преобразовать байт в аккумуляторе в слово CLC; сбросить флаг переноса CLI; сбросить флаг прерываний STC; установить флаг переноса КОП 15 0 15 EA SI 15 0 DI 0 15 0 EA Адресация цепочек Адресация портов ввода-вывода КОП port Прямая адресация портов ВВ IN AL,40h ; ввести байт из порта 40h OUT 1Eh,AX ; вывести слово в порт 1Eh 7 0 КОП 15 0 DX Косвенная адресация портов ВВ MOV DX, 60h IN AX,DX OUT DX,AX ; загрузить в DX адрес порта ВВ ; ввод слова из порта с адресом (DX) ; вывод слова по адресу (DX) Распределение адресного пространства ЭВМ 220 адресов – адресное пространство базового МП: 00000h … FFFFFh XMS –Extended Memory Specification HMA – High Memory Area