Size: a a a

Ассемблер

2021 April 19

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
и твою запись можно сократить на 1 инстукцию не жертвуя ничем
источник

CM

Charlie Mumble in Ассемблер
Рили все норм, переписал вывод
источник

CM

Charlie Mumble in Ассемблер
А как?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
умножать не регистр на регистр, а регистр на память
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
загрузил Х, и умножил ст0 сразу на память Y. а ты сразу загружаешь два значение из памяти, делаешь действие. но потом опять писать лишние инстукции чтоб стек подчищать от ненужных данных
источник

CM

Charlie Mumble in Ассемблер
Сложно, если честно)
Лучше оставлю как есть, чтобы потом разобраться

Итого, у меня сейчас такой код:

@Data
 x  dt 2.0
 y  dt 4.0        

 f  dt ?

 const_4  dt 4.0        
 
@Begin
         fld x     ; st(0) = x
         fld const_4   ; st(0) = 4
         fmul      ; st(0) = 4*x
         fsin     ; st(0) = sin(4*x)
         
 fstp f
 ffree st(0)
 fpPrint f

         
 KeyPressed
@end          

sin(4x) у меня считается, слава Богу)
поделить теперь это на (x+y)^3 ?
источник

A

Aleksandr in Ассемблер
Посчитать таким же образом это твое (x+y)^3
источник

A

Aleksandr in Ассемблер
И потом fdiv
источник

CM

Charlie Mumble in Ассемблер
Ща попробую
источник

CM

Charlie Mumble in Ассемблер
; sin(4x)
         fld x    
         fld const_4  
         fmul      
         fsin    
         
         ; sin(4x)/(x+y)^3
 fld x
 fld y
 fadd
 fmul st(0), st(0)
 fmul st(0), st(0)
 fdiv

Вышло такое. Удивительно, но оно практически работает.
Единственная проблема, (x+y) возводится не в куб, а в 4 степень, и я хз как это исправить...(
источник

A

Aleksandr in Ассемблер
Есть команда дублирования значения на вершине стека
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
дважды загружаешь сумму, первый разперемножаешь, без выталкивания - это будет квадрат, второй раз с выталкиванием - это куб с очисткой от ненужных данных стека
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
а не будешь чистить - в дальнейшем поломаешь голову, тем более ты без отладчика пишешь
источник

A

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

CM

Charlie Mumble in Ассемблер
; sin(4x)/(x+y)^3fld x
 fld y
 fadd
 fadd
 fmul st(0), st(0)
 fmulp st(0), st(0)
 fdiv
Пока что не работает. Что я делаю не так? И как очистить стек?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
давай начнем стого что не стоит лишний раз загружать значение. я тебе выше говорил что умножать/складывать можно не только регистр на регистр, но и регистр на память
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
а чтоб не путаться от мнимых операндов, пиши их как положенно.
fadd st0,st1  типа так
источник

CM

Charlie Mumble in Ассемблер
Ошибку выдает:
fadd st0, st1
Error C:\pr7.ASM(20) Undefined symbol: ST0
 fadd st0, st1
*Warning* C:\pr7.ASM(20) Argument needs type override
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
потому что ты записал регистр не так как предусмотренно ассемблером на котором ты пишешь
источник

CM

Charlie Mumble in Ассемблер
Да, это исправил
источник