Сейчас на форуме: Rio, tyns777, zombi-vadim (+5 невидимых)

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


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

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

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

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

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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

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

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



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 10 мая 2015 11:45 · Поправил: dosprog
· Личное сообщение · #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.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

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

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



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

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

Rainbow пишет:
dec cx


dec Ecx

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

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




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 11 мая 2015 13:41 · Поправил: Rainbow
· Личное сообщение · #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) по факту есть...



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

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

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

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


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

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

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


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



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

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

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


 eXeL@B —› Программирование —› Вопрос по компилю масма
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати