100 likes | 293 Views
op 1 op 2. Числа со знаком. Числа без знака. > >= = <= <. ZF=0 и SF=OF SF=OF ZF=1 ZF=1 и SF<>OF SF<>OF (SF OF = 1). CF =0 и ZF =0 CF=0 ZF=1 CF =1 и ZF =1 CF =1. Команда CMP op 1, op 2 ; – сравнение.
E N D
op1 op2 Числа со знаком Числа без знака > >= = <= < ZF=0 и SF=OF SF=OF ZF=1 ZF=1 и SF<>OF SF<>OF (SF OF = 1) CF=0 и ZF=0 CF=0 ZF=1 CF=1 и ZF=1 CF=1 Команда CMPop1,op2 ; – сравнение. В соответствии с результатом устанавливаются следющие флаги: Состояние всех флажков определяется получаемой разностью op1-op2 и их можно проверить командами условного перехода . Команды преобразования операнда. Для правильной работы команды деления необходимо подготовить старшие разряды делимого (AH,DX,EDX,EAX), заполнив их знаковым разрядом (AL,AX,EAX). CBW – преобразовать байт в слово знак AL расширяется в AH CWD - слово в DWORD, знак AX в DX CWDE - слово в DWORD, знак AX в EAX старшие 16 бит CDQ – DWORD в QWORD, знак EAX в EDX
Команды передачи управления (переходы и циклы) Специальные команды, которые модифицируют указатели программной памяти – регистры CS: EIP/IP, называются командами передачи управления (или командами управления программами). Сегментная организация памяти определяет два вида команд передачи управления: · Внутрисегментные – при этом изменяется только регистр EIP/IP, т.е. адрес перехода задает смещение (байт, слово, двойное слово) внутри сегмента кода. Ее называют близкой, т.е. имеющей тип NEAR. · Межсегментные – модифицируют CS и EIP/IP. Адрес перехода задается полным (20, 32, 48 битным) указателем CS: EIP/IP/. Переход называется дальним, т.е. имеет тип FAR. В программе на ассемблере адрес перехода задается просто меткой той команды, которой передается управление. Assembler в соответствии с типом NEAR или FAR формирует нужную команду.
Команды безусловного перехода. Формат: JMP op ; op - метка/(рег./ память) Команда JMP имеет 5 форм, определяемых типом перехода и способом задания адреса перехода. Внутрисегментный переход: 1) JMP SHORT M1 ; Внутрисегментный короткий прямой переход, . . . . . . ; смещение 1 байт ( от -128 до +127) . . . . . . ; IP = IP + смещение ( смещение = М1: mov ax, bx ; = OFFSET M1 - OFFSET (JMP + SIZE JMP)) 2) JMP NEAR M2 ; Внутрисегментный ближний прямой переход, . . . . . ; IP/EIP = IP/EIP + смещение 16/32 бита M2: mov cx, 100 3) JMP reg/mem ; Внутрисегментный косвенный переход. Адрес ; перехода в регистре или памяти - 16/32 бита ; ( reg/mem ) --> IP/EIP Например:. . . . . . ADRM3 DW M3 . . . . . . MOV DX, ADRM3 JMP DX . . . . . . M3: NOP
Межсегментный переход: 4) JMP FAR PTR M4 ; Межсегментный прямой переход ( дальний ), метка М4 в дтугом программном сегменте, CS <-- SEG M4 IP/EIP <-- OFFSET M4 5) JMP DWORD PTR MEM ; Межсегментный косвенный переход IP/EIP <-- ( MEM ) CS <-- ( MEM + 2 ) Например: JMP DWORD PTR MEM1 . . . . . . . . . . MEM1 DD OFFSET M5 ; M5 - в другом сегменте кода SEG M5 ;
Команды условного перехода (передачи управления ) Позволяют проверить любое соотношение между знаковыми ( >, <, >=, <=, =, != ) и беззнаковыми ( "выше" (above) - "ниже" (below) ) числами, а также состояния всех арифметических флажков, кроме флажка AF в регистре EFLAGS(FLAGS). Все команды условного перехода осуществляют передачу управления только в пределах текущего сегмента кода (т.е. содержимое CS не изменяется). Переход реализуется прибавлением к рег. EIP/IP смещения, находящегося в команде. Формат: Jcc метка сс - комбинация символов L (less),G (greater), E (equal), N (no)- для знаковых чисел(результата операции) и А (above), B (below), E,N - для беззнаковых. C, O, Z, P, S c E и/или N - для флажков. Для процессоров 8086/80286 переход осуществляется в пределах от -128 до +127 байт от адреса следующей после Jcc команды ( смещение в команде 8 бит ) Для процессоров i386, i486 и выше переход возможен в пределах всего текущего сегмента кода ( т.е. допустимо полное 16- или 32- битовое смещение )
Мнем Альтерн. мнем. Проверяемое условие Название: Перейти, если JZ JE ZF=1 = 0 или равно JNZ JNE ZF=0 не 0 или не равно JS - SF=1 - (знак установлен) JNS - SF=0 + (знак сброшен) JO - OF=1 переполнение JNO - OF-0 нет переполнения JP JPE PF=1 паритет установлен (четный пар) JNP JPO PF=0 паритет сброшен (нечетный пар) JB JNAE, JC CF=1 ниже (не выше или = ) JNB JAE, JNC CF=0 не ниже (выше или = ) JBE JNA CFZF=1 ниже или равно (не выше) JNBE JA CFZF=0 не ниже или выше JL JNGE SFOF=1 меньше JNL JGE SFOF=0 не меньше (>=) JLE JNG (SFOF)ZF=1 не больше (<=) JNLE JG (SF=OF)ZF=0 SF=OF больше Команды условного перехода
Мнемоника, формат Альтернативная мнемоника Изменение СХ, проверяемое условие для перехода, LOOP метка СХ = СХ - 1; IF (( СХ ) != 0) GOTO метка: LOOPZ метка LOOPE метка СХ = СХ - 1; IF (( СХ ) != 0 & ZF= = 1) GOTO метка: LOOPNZ метка LOOPNE метка СХ = СХ - 1; IF (( СХ ) != 0 & ZF = = 0) GOTO метка: JCXZ метка IF ((CX= = 0) GOTO метка Команды управления циклом. Используют регистр СХ (ЕСХ) в качестве счетчика циклов.
Пример 1. Определить сумму элементов массива АR1[100]. data segment para public 'data' AR1 dw 100 dup(?) sum dw ? data ends . CODE .STARTUP start: push ds push ax mov ax,data mov ds,ax . . . . . ; Ввод и преобразование массива AR1 . . . . . mov cx,100 mov bx, offset AR1 ; lea bx, AR1 xor ax,ax mov si,ax M1: add ax,[bx][si] inc si ; add si,2 inc si loop M1 mov sum,ax . . . . . ; Вывод результата на экран . . . . . ; продолжение программы pop ax pop ds mov ax, 4C00h int 21h .EXIT END
Пример2. Табличные преобразования. Перекодировать текст 256 байт из строки st1 в строку st2 в код Грея. D1 segment para public 'data' st1 db 256(?) st2 db 256(?) GRAY db 256(?) ; Таблица кода Грея D1 ends C1……………………… pr1: mov ax, D1 mov ds,ax mov es,ax . . . . . ; Вводстроки st1 mov cx,256 mov si, offset st1 mov di, offset st2 lea bx, GRAY jcxz CON1 MET1: lods st1 ; lodsb xlat GRAY stos st2 ; stosb loop MET1 . . . . . CON1: . . . . . C1 ends end pr1
Адресные передачи.Команды передачи адресных объектов. Реализуются командами: LEA reg, mem ; Загрузить эффективный адрес (смещение) Например: lea bx, AR1 lea ax, [bx][si] lea eax, [ax][ax*4] ; ax = ax + 4*ax = 5*ax Команды загрузки сегментных регистров . Lxx reg, mem ; Загрузка полного набора указателей из памяти в соответствующий сегментный регистр reg, заданный первым операндом. xx - GS, SS, DS, ES, FS CS загружать нельзя! Например: LDS SI, MEM1 ; MEM1: offsetadr, segadr (16, 32 бита) ( 16 бит )