Size: a a a

Ассемблер

2021 August 16

V

Vladimir in Ассемблер
почему-то вот такое вставляется
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
источник

E

Entusiast in Ассемблер
А что ты хочешь? Нет такой инструкции
источник

d

disba1ancer in Ассемблер
Entusiast а что быстрее:
это
cmp     maxblks, eax
cmovnc  maxblks, eax
или это
cmp     eax, maxblks
cmovc   maxblks, eax
или без разницы?
источник

E

Entusiast in Ассемблер
Это же два одинаковых кода
источник

d

disba1ancer in Ассемблер
поправил
источник

s

s54816 in Ассемблер
А почему у тебя хексдамп хексдампа?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
не мое
источник

s

s54816 in Ассемблер
Промахнулся. @Vladimir1c почему?
источник

E

Entusiast in Ассемблер
maxblks это что?
Зачем ты регистр с адресом сравниваешь

И cmovcc m, r нет
Только cmovcc r,r
Или cmovcc r, m
источник

V

Vladimir in Ассемблер
я пытаюсь повторить по ролику на ютубе, там чел вставляет некую строку, я ее переписал из видео, но почему-то у него работает, а меня явно чтото не то вставляется)
источник

s

s54816 in Ассемблер
В блокноте открой файл, который у тебя справа открыт. И вот это уже вставляй.
источник

s

s54816 in Ассемблер
Ой, там ещё и дважды hex. Внутри что-то невразумительное. Но я bing-ом скриншот распознавал, может он налажал.
источник

V

Vladimir in Ассемблер
я вот так делаю. это получается строка битая все-таки?
источник

E

Entusiast in Ассемблер
0. Используй lea, вместо mov, где нужно класть адрес. У тебя чаще всего AGU своободен выходит, а ты его не используешь
1. Не забывай про XOR, когда нужно класть 0 в регистр
2. Выравнивание 32 байта для инструкции REP намного улучшит её работу. Да и вообще с выравниванием у тебя беда
3. Не нужно использовать inc/add +1 (если нужен инкремент), и после этого не использовать флаги. Если тебе не нужны флаги - используй LEA:
inc ecx
xor edx, edx

lea ecx, dword[ecx+1]
xor edx, edx

4. Я видел, что ты используешь TEST, если нужно сравнивать с нулём. Это правильно, но почему-то в других участках ты используешь cmp, или or. Используй всегда test eax, eax / jz. С условием, что test - сливается, он работает быстрее, если нужно проверять с нулём, и вообще быстрее.

5. xchg. Ты им слишком злоупотребляешь. Используй xor^3. На практике он работает лучше:
xchg edx, eax

xor edx, eax
xor eax, edx
xor edx, eax

6. В этом участке лучше сделать джамп таблицу. Тебе прямо под руку, что проверка идёт по счёту - 0, 1, 2, 3:
cmp byte [wozflag],00h
je .wozratadd

cmp byte [wozflag],01h
je .wozratsub

cmp byte [wozflag],02h
je .wozratmul

test  ebx, ebx      ;проверка деления на ноль целочисл.
jz     DialogProc.processed ;

cmp byte [wozflag],03h
je .wozratdiv

Ошибки повторяются по всему коду. Но это не смотря ещё на странное поведение в коде, вроде:
mov [tmpX], edi
mov edi, [tmpX]
источник

d

disba1ancer in Ассемблер
это алиас на регистр
источник

E

Entusiast in Ассемблер
Без разницы
Внутри только порядок поменяется. В зависимости от условий может быть чуточку одно из этих будет работать быстрее
источник

d

disba1ancer in Ассемблер
основная разницы в том что если регистры равны в первом случае идёт mov, во втором ничего не делается, а результат одинаковый
источник

E

Entusiast in Ассемблер
В каком разница? Где? В первом будет такое, или во втором?
Не слышал никогда об этом
источник

d

disba1ancer in Ассемблер
ты невнимательно читал код?
источник