eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 10 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Вопрос по компилю масма
Посл.ответ Сообщение


Ранг: 110.0 (ветеран)
Статус: Участник

Создано: 10 мая 2015 10:42 · Поправил: 10 мая 2015 10:43 Rainbow New!
Цитата · Личное сообщение · #1

Есть в языке в том языке директива интересная - .untilcxz, компилится в LOOPD-команду asm языка.

.repeat+.untilcxz= E2 XX ; LOOPD SHORT XXXXXXXX (по границе цикла)

Вопрос: нечто подобное выскоуровневое под jecxz/etc. есть ?


Ранг: 994.1 (! ! !)
Статус: Участник

Создано: 10 мая 2015 11:34 New!
Цитата · Личное сообщение · #2

--> Link <-- все что есть

Ранг: 387.5 (мудрец)
Статус: Участник

Создано: 10 мая 2015 11:45 · Поправил: 11 мая 2015 19:22 dosprog New!
Цитата · Личное сообщение · #3

Так это и есть опрерация с ЕСХ, а не с СХ:

Code:
  1.            mov ecx,10000h
  2. .REPEAT 
  3.            nop
  4. .UNTILCXZ
Получится вот такое:
Code:
  1.  
  2.  .00401009: B900000100________ mov ecx,000010000
  3.  .0040100E: 90________________ nop             
  4.  .0040100F: E2FD_______________loop   .00040100E   



Смысла в этом макросе мало, почти нету:

он не умеет изменять код в зависимости от величины лоопа.
То-есть, если имеем вот такой код:
Code:
  1.    mov ecx,10000h
  2. .REPEAT 
  3.    nop
  4.    db 200h dup(90h) ;;;<<---------Добавили операций ! Лооп увеличился.
  5. .UNTILCXZ
- то получим ошибку трансляции:
Code:
  1.  Assembling: prob.asm
  2. prob.asm(108) : error A2075: jump destination too far : by 387 byte(s)


А вот так будет работать по-любому:
Code:
  1.    mov ecx,10000h
  2. @@loop2:
  3.    db 1000h dup(90h)
  4.    dec ecx  
  5.    jecxz @@loop2_end
  6.    jmp @@loop2
  7. @@loop2_end:



-- Добавлено --

Ну, кажется, понял - претензия как раз к ближнему прыжку.. С .UNTILCXZ ничего не выйдет.
Но можно навоять собственных макросов (вроде UNTILеCXZ), которые будут творить что угодно.
Только зачем?..

А можно вот так написать, будет работать:
Code:
  1.     mov ecx,10000h
  2. .WHILE 1
  3.     db 1000h dup(90h)
  4.     dec ecx
  5.    .BREAK .IF ecx==0
  6.    .ENDW

- но смысл? - Только усложняет понимание и ухудшает переносимость.

В общем, это отголоски бытовавшего в своё время мнения, что-де "метки - это зло".



Ранг: 110.0 (ветеран)
Статус: Участник

Создано: 10 мая 2015 12:45 · Поправил: 10 мая 2015 12:46 Rainbow New!
Цитата · Личное сообщение · #4

Речь идет о:
LOOPD (E2) = dec cx+cmp cx+je
JECXZ (E3) = cmp cx+je

Ранг: 387.5 (мудрец)
Статус: Участник

Создано: 10 мая 2015 13:58 · Поправил: 10 мая 2015 14:04 dosprog New!
Цитата · Личное сообщение · #5

Rainbow пишет:
dec cx


dec Ecx

сх - это будет в 16-битном коде. В примерах, что я рассматривал, - 32-бит код, значит Ecx.

И всёже тогда, выходит, я не понял сути вопроса..
Впрочем, reversecode дал ссылку на список директив.
Других директив там нету.


Ранг: 110.0 (ветеран)
Статус: Участник

Создано: 11 мая 2015 13:41 · Поправил: 11 мая 2015 13:50 Rainbow New!
Цитата · Личное сообщение · #6

Вообщем мне кажется мну не совсем поняли.
dosprog пишет:
А вот так будет работать по-любому

Будет, будет. Смысл в чем. Твой пример показан на низком уровне, только вместо адресов метки. На высоком масме такой цикл может быть записан так:

.repeat

<SOME OPERATIONS>
.BREAK .IF ECX==0

.until FALSE

Алгоритмически правильно будет закомпилено по-любому. Но из особенностей компиля, он сгенерит так же, как и у тебя в примере, только вместо jecxz(E3) будет сперва TEST ECX, ECX, JE ADDR = 2+2(5) bytes

jecxz=2bytes; TEST+JE=2+2 bytes; 2+2 - 2 = 2 bytes economy

Не, ну я конечно понимаю, что энто все можно закодить через DEC REG+.break .if zero?, например, но опять же, 1+2 - 2 = 1 bytes economy

Вопрос: не юзает чтоли инструкцию в high-lev вовсе ?.. Кондишна под инструккцию, типа .ifcxz или .if cxz? Ведь .untilcxz(LOOPD) по факту есть...

Ранг: 387.5 (мудрец)
Статус: Участник

Создано: 11 мая 2015 14:36 New!
Цитата · Личное сообщение · #7

Если счёт идёт на байты, то тогда надо уже не стандартные макросы применять, а собственные.
Где всё желаемое реализуется через директиву 'DB'.

| Сообщение посчитали полезным: Rainbow



Ранг: 110.0 (ветеран)
Статус: Участник

Создано: 11 мая 2015 14:40 New!
Цитата · Личное сообщение · #8

dosprog пишет:
Где всё желаемое реализуется через директиву 'DB'.


Красиво задвинул ))) Вообщем жаль, что есть .untilcxz и нет .ifcxz )))

Ранг: 387.5 (мудрец)
Статус: Участник

Создано: 11 мая 2015 19:20 · Поправил: 11 мая 2015 19:23 dosprog New!
Цитата · Личное сообщение · #9

Использование макросов для условий/циклов имеет целью избежать применение меток,
когда, вставив в текст программы кусок другой программы (или размножив кусок этой же), почти наверняка (при копировании куска этой же программы - наверняка) получим конфликт имён меток, а это путь наделать ошибок. Тогда как при использовании директив вроде .IF, .WHILE, .UNTIL в программах меток нет, и куски кода легко компоновать. Другого обоснования применению этих директив нет.
То есть, если заранее смириться с вознёй с метками, то можно обходиться и без макросов, тем более, что наглядности они добавляют сомнительной.
 eXeL@B —› Программирование —› Вопрос по компилю масма

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS