Size: a a a

Ассемблер

2021 August 16

E

Entusiast in Ассемблер
Наоборот
Если не убрать CRT, и -fno-stack-protector
Тогда можно потерять всю производительность, и тут даже O3 не вывезет.
На ассемблере можно писать лучше, и FASM в этом поможет, и оптимизацию познавать долго не надо, всего-лишь две книжечки под рукой, Google, и вот у тебя уже на руках хороший код

На самом деле, до этого уже было большое обсуждение, и факт в том, что компиляторы способны промахиваться - не важно при каких условиях - если это ты написал неудобный код, если ты не отключил флаг, если не включил флаг, забыл какой-то флаг - оптимизировать надёжнее руками, а лучше - писать с нуля, на ассемблере.
Компилятор не способен оптимизировать какую-то функцию  в маленький вес, а цикл в максимальную скорость для микроархитектуры - у него только заготовки - либо вес, либо скорость, либо ничего. Есть ещё что-то посередине, но работает, как оказалось, плохо
источник

D

Dr.web in Ассемблер
компиляторы асм примитивны
источник

s

s54816 in Ассемблер
Стек протектор, O3, freestanding — это всё сишные флаги, зачем ты их указываешь?
источник

E

Entusiast in Ассемблер
Разве GAS компилируют не GCC?
источник

s

s54816 in Ассемблер
GCC компилирует в GAS. И вот эти флаги влияют на кодогенерацию. Или ты про что? Собирать можешь и cc, и as. Просто cc — это драйвер, он потом сам линкер вызовет.
источник

E

Entusiast in Ассемблер
Я в последний раз смотрел компиляцию GAS, и компилировал через GCC

Ну и он мне навешал туда всё, что захотел
Когда флаги поставил Сишные - сгенерировал нормально
источник

E

Entusiast in Ассемблер
Может я неправильно что-то сделал, конечно. Я на GNU никогда ничего серьёзного не писал, только смотрел внутрь к нему
источник

A

Aleksandr in Ассемблер
а если через gcc -c?
источник

E

Entusiast in Ассемблер
Я сейчас не смогу проверить
источник

s

s54816 in Ассемблер
Через -c будет .o.
источник

A

Aleksandr in Ассемблер
а сьест ли он .S с флагом -c?
источник

s

s54816 in Ассемблер
Конечно. Оно само ничего не компилирует, оно смотрит на расширение и дёргает нужный компилятор-ассемблер-линкер.
источник

ВВ

Вячеслав Васютин... in Ассемблер
Так можно в fasm?
StrBuffer = 1024
StringSize db StrBuffer
источник

A

Aleksandr in Ассемблер
да
источник

ВВ

Вячеслав Васютин... in Ассемблер
Thanks
источник

s

s54816 in Ассемблер
Нет. db — это define byte, 1024 в байт не влезет.
источник

A

Aleksandr in Ассемблер
обрежется же, нет?
источник

s

s54816 in Ассемблер
Нет, обругают.
источник

ST

Saenro T in Ассемблер
Так он хочет buffer из 1024 (rb/dup)
источник

ВВ

Вячеслав Васютин... in Ассемблер
Фу... Что за дрянь. Уже по образцу делаю https://github.com/simon-whitehead/assembly-fun/blob/master/linux-x64/4.read-input/4.read-input.s

И все равно segmentation fault (хочу попросить юзера ввести два числа, сложить их и вывести на экран):

format ELF64 executable

segment readable executable

mov rax, 1
mov rdi, 1
mov rsi, qword [msg]
mov rdi, [MsgSize]
mov [raxdata], rax
syscall

mov rax, sys_read
mov rdi, stdin
mov rsi, qword [strbuf]
mov rdx, [strsize]
mov [FirstOperand], rsi
syscall

mov rax, [raxdata]
mov rdi, 1
mov rsi, qword [Messange]
mov rdx, [MessangeSize]
syscall

mov rax, sys_read
mov rdi, stdin
mov rsi, qword [StrBuffer]
mov rdx, [StringSize]
mov [SecondOperand], rsi
syscall

mov rbx, [FirstOperand]
add rbx, [SecondOperand]
mov [RbxData], rbx
mov rbx, [Thirty]
sub [RbxData], rbx

mov rax, [raxdata]
mov rdi, 1
mov rsi, [RbxData]
mov rdx, qword [strbuf]
syscall





segment readable writeable

; System data

stdout dq 1
stdin dq 0
sys_write dq 1
sys_read dq 0


; Data
raxdata dq ?
strsize = 1024
strbuf rb strsize
StrBuffer rb StringSize
StringSize = 1024

msg db "Enter first number: ", 10, 0
Messange db "Enter second number: ", 10, 0
MessangeSize = $-Messange
MsgSize = $-msg

FirstOperand dq ?
SecondOperand dq ?

RbxData dq ?
Thirty dq 30
источник