Тәжірибелік жұмыс
Пән: «Микропроцессорлық техника негіздері»
Курс тақырыбы: 6.2 тақырып. Процессордың негізгі командалары
Сабақтың тақырыбы: Арифметикалық және логикалық командаларды бағдарламалау
Жұмыстың мақсаты: Студенттерге ассемблердiң арифметикалық операцияларының жұмыс тәртiбiн, сонымен қатар жылжу, көбейту, қосу т.б. командаларын таныстыру.
Қысқаша теориялық мағлұмат Арифметикалық командалар
Олардың негiзiлерi төмендегi кестеде көрсетiлген:
1-кесте
Мнемоника (опN = операндN) | Операнд түрi | Орындалу логикасы | Өзгеретiн жалаушалар |
ADD оп1, оп2 | R, A A, I R, I R, M M, R M, I | оп1 = оп1 + оп2 Қарапайым қосу | O, S, Z, A, P, C |
ADC оп1, оп2 | R, A A, I R, I R, M M, R M, I | оп1 = оп1 + оп2 + CF Тасымалдау есебiнен қосу CF = 1, то оп1 = оп1 + оп2 + 1 | O, S, Z, A, P, C |
SUB оп1, оп2 | R, R M, R R, M A, I R, I M, I | оп1 = оп1 - оп2 Азайту | O, S, Z, A, P, C |
SBB оп1, оп2 | R, R M, R R, M A, I R, I M, I | оп1 = оп1 - оп2 - CF Тасымалдау есебiнен азайту | O, S, Z, A, P, C |
MUL оп1 | R8 R16 M8 M16 | AX = AL * оп1, DX:AX = AX * оп1, | O, C |
DIV оп1 | R8 R16 M8 M16 | AL = AX / оп1; AH = қалдық, AX = DX:AX / оп1; AX = қалдық | D, I, T жалаушалары өзгермейдi. |
SHL оп1, оп2 | R, 1 R, CL M, 1 M, CL | CF ← оп1 ← 0 Биттердi солға жылжыту | O, S, Z, P, C. |
SHR оп1, оп2 | R, 1 R, CL M, 1 M, CL | 0 → оп1 → CF Биттердi оңға жылжыту | O, S, Z, P, C. |
2-кесте Екiлiк арифметика командалары
A | B | A AND B | A OR B | A XOR B | NOT A |
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
JC командасын қолдану командасы:
mov AX, 2 shr AX, 1 jc L_BitIsSet ... L_ BitIsSet: ... |
JNZ командасын қолдану командасы:
mov AX, 12h ; AX = 0001 0010b and AX, 80h jnz L_NotZero ... L_NotZero: ... |
Лабораториялық жұмыстың орындалу тәртiбi:
Жоғарыда көрсетiлген программасы бар текстiк файл құрып, ассемблерлеп, құрастырып, .exe файл құру қажет. Оның орындалуын td.exe программасының көмегiмен бақылау қажет.
Программаны оқытушыға көрсетiп, қорғауға дайындалу қажет.
Арифметические и логические команды
Большинство арифметических и логических команд влияют на регистр состояния процессора (или Флаги)
Как вы можете видеть, в этом регистре 16 бит. Каждый бит называется флагом и может принимать значение 1 или 0.
Carry Flag (CF) - перенос - этот флаг устанавливается в 1, когдаслучается беззнаковое переполнение. Например, если вы увеличили байт 255 + 1 (результат не помещается в диапазоне 0...255). Если переполнение не происходит, этот флаг установлен в 0.
Zero Flag (ZF) - ноль - устанавливается в 1, если результат равен нулю. Если результат не нулевой, то этот флаг устанавливается в 0.
Sign Flag (SF) - знак - установлен в 1, если результат -отрицательное число. Если результат положительный, то этот флаг устанавливается в 0. Обычно этот флаг принимает значение старшего значащего бита.
Overflow Flag (OF) - переполнение - устанавливается в 1, если случается переполнение при арифметических операциях со знаком. Например, если вы увеличили байт 100 + 50(результат не помещается в диапазоне -128...127).
Parity Flag (PF) - контроль четности - этот флаг устанавливается в 1, если в младших 8-битовых данных четное число. Если число нечетное, то этот бит установлен в 0. Даже если результат - это слово, то анализируются только 8 младших бит!
Auxiliary Flag (AF) - внешний перенос - установлен в 1, если случилось переполнение без знака младших 4-х битов (т.е. перенос из 3-го бита).
Interrupt enable Flag (IF) - прерывание - если этот флаг установлен в 1, то процессор реагирует на прерывание от внешних устройств.
Direction Flag (DF) - направление - этот флаг используется некоторыми командами для обработки цепочки данных. Если флаг установлен в 0 - обработка происходит в прямом направлении, если 1 - в обратном.
Имеются три группы команд.
Первая группа: ADD, SUB,CMP, AND, TEST, OR, XOR
Эти типы операндов поддерживаются:
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory: [BX], [BX+SI+7], переменная, и т.п...
immediate: 5, -24, 3Fh, 10001101b, и т.п...
После операции между операндами результат всегда записывается в первый операнд. Команды CMP и TEST воздействуют только на флаги и не записывают результат (эта команда используется для принятия решения во время выполнения программы).
Эти команды влияют только на флаги:
CF, ZF, SF, OF, PF, AF.
ADD - Прибавить второй операнд к первому.
SUB - Вычесть второй операнд из первого.
CMP - Вычесть второй операнд из первого только для флагов.
AND - Логическое И между всеми битами двух операндов. При этом соблюдаются правила:
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0
Как видите, мы получаем 1 только в том случае, если оба бита равны 1.
TEST - То же самое, что AND, но только для флагов.
OR - Логическое ИЛИ между всеми битами двух операндов. При этом соблюдаются правила:
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
Как видите, мы получаем 1 каждый раз, когда хотя бы один бит равен 1.
XOR - Логическое XOR (исключающее ИЛИ) между всеми битами двух операндов. При этом соблюдаются правила:
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
Как видите, мы получаем 1 каждый раз, когда биты имеют различное значение.
Вторая группа: MUL, IMUL, DIV, IDIV
Эти типы операндов поддерживаются:
REG
memory
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory: [BX], [BX+SI+7], переменная, и т.п...
Команды MUL и IMUL влияют только на эти флаги:
CF, OF
Если результат превышает размер операнда, то эти флаги установлены в 1, если результат умещается в размер операнда, то эти флаги установлены в 0.
Для команд DIV и IDIV флаги не определены.
если операнд - это байт: AX = AL * операнд. если операнд - это слово: (DX AX) = AX * операнд.
IMUL - умножение со знаком: если операнд - это байт: AX = AL * операнд. если операнд - это слово: (DX AX) = AX * операнд.
DIV - беззнаковое деление: если операнд - это байт: AL = AX / операнд AH = остаток (модуль). . если операнд - это слово: AX = (DX AX) / операнд DX = остаток (модуль). .
IDIV - деление со знаком: если операнд - это байт: AL = AX / операнд AH = остаток (модуль). . если операнд - это слово: AX = (DX AX) / операнд DX = остаток (модуль). .
Третья группа: INC, DEC, NOT, NEG
Эти типы операндов поддерживаются:
REG
memory
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory: [BX], [BX+SI+7], переменная, и т.п...
Команды INC и DEC влияют только на эти флаги: ZF, SF, OF, PF, AF.
Команда NOT не влияет ни на какие флаги!
Команда NEG влияет только на эти флаги: CF, ZF, SF, OF, PF, AF.
NOT - инвертирование каждого бита операнда.
NEG - Меняет знак операнда (дополнение до двух). Обычно она инвертирует каждый бит операнда, а затем прибавляет к нему единицу. Например, 5 преобразуется в -5, а -2 преобразуется в 2.