Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместить две логические операции 
V
    Опции темы
Ak47black
  Дата 29.11.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Обдумываю как тут лучше сделать следующий код на чистом языке ассемблера
Например есть такой код
Код

    mov ax, 0
    mov bx, 3
    .IF ax!=3 && bx==5
        mov cx, 2
    .ENDIF

хочу сделать без деректив условной трансляции.
Возможно-ли както уложится в один условный переход?
PM MAIL   Вверх
586
Дата 29.11.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: нет
Всего: 146



Код
    mov ax, 0
    mov bx, 3

    cmp ax, 3
    je @f
    cmp bx, 5
    jne @f
        mov cx, 2
@@:

PM   Вверх
Mikl_
Дата 2.12.2009, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



Ak47black, можно вообще без условных переходов
Код
.586; команды setcc появились в процессорах Pentium
cmp ax,3
setne dl; IF ax!=3 then dl=1 else dl=0
cmp bx,5
sete dh; IF bx==5 then dh=1 else dh=0
and dl,dh; IF ax!=3 && bx==5 then dl=1 else dl=0
cmovnz cx,2; IF dl==1 then cx=2
 smile 


Это сообщение отредактировал(а) Mikl_ - 7.12.2009, 06:28
PM MAIL   Вверх
Mikl_
Дата 2.12.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



Ak47black
только .IF ax!=3 && bx==5 и .ENDIF это не диррективы условной трансляции, так как транслятор не может знать ЧТО окажется в регистрах AX и BX к тому моменту, когда очередь дойдет до этого кода .IF и .ENDIF это т.н. "высокоуровневый синтаксис" ассемблера который "переведется" в ассемблерные команды CMP/JE/JNE. 
Диррективы условной трансляции позволяют проанализировать определенные условия в ходе генерации макрорасширения и, при необходимости, изменить этот процесс; 
директивы генерации ошибок по условию также контролируют ход генерации макрорасширения с целью генерации или обнаружения определенных ситуаций, которые могут интерпретироваться как ошибочные. 
С этими директивами применяются директивы управления процессом генерации макрорасширений EXITM и GOTO. 
Директива EXITM не имеет операндов она немедленно прекращает процесс генерации макрорасширения, начиная с того места, где она встретилась в макроопределении. 
Директива GOTO имя_метки переводит процесс генерации макроопределения в другое место, прекращая последовательное разворачивание строк макроопределения. Метка, на которую передается управление, имеет специальный формат: :имя_метки
Директивы компиляции по условию предназначены для организации выборочной трансляции фрагментов программного кода. Такая выборочная компиляция означает, что в макрорасширение включаются не все строки макроопределения, а только те, которые удовлетворяют определенным условиям. То, какие конкретно условия должны быть проверены, определяется типом условной директивы. 
Всего имеется 10 типов условных директив компиляции. Их попарно объединяют в четыре группы: 
Директивы IF и IFE - условная трансляция по результату вычисления логического выражения. 
Директивы IFDEF и IFNDEF - условная трансляция по факту определения символического имени. 
Директивы IFB и IFNB - условная трансляция по факту определения фактического аргумента при вызове макрокоманды. 
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI - условная трансляция по результату сравнения строк символов. 
Условные директивы компиляции имеют общий синтаксис и применяются в составе синтаксических конструкции типа: 
IFxxx логическое_выражение_или_аргументы
фрагмент_программы_1
 ELSE
фрагмент_программы_2
ENDIF
Директивы компиляции по условию использовались, например, при написании в рамках одной программы двух версии программы: демонстрационной (облегченной) и коммерческой (полной), или при выдачи сообщений на разных языках (английская и русская версии одной программы) и т.п.
Код
.model tiny; приложение типа СОМ
.286
.code
english equ 1; определяем на каком языке будут наши сообщения
org 100h
begin:    mov ah,9
    mov dx,offset a0    ;Выводим 'Hello, world!'
    int 21h
    mov ah,0; ждем когда нажмут любую клавишу
    int 16h
    ret; выходим из программы
IF english
a0 db 'Hello, world!$'
ELSE
a0 db 'Здраствуй, мир!$'
ENDIF
end    begin
 smile 
 


Это сообщение отредактировал(а) Mikl_ - 3.12.2009, 11:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.