Size: a a a

Ассемблер

2020 June 14

d

damagekidϡ in Ассемблер
Loren White
как в смешном NASM сделать массив ?

section .rdata align=4
AbsMaskF32 dword 7fffffffh, 7fffffffh, 7fffffffh, 7fffffffh
AbsMaskF64 qword 7fffffffffffffffh, 7fffffffffffffffh

по разному пытался, но выдает ошибку:
foo.asm:2: error: parser: instruction expected
foo.asm:3: error: parser: instruction expected
а почему смешной?
источник

LW

Loren White in Ассемблер
жопа после MASM горит потому что
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
там разница в основном в способе записи операндов - адрес или значение
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
masm
mov eax,a

nasm
mov eax,[a]
———————
masm
mov eax, offset a

nasm
mov eax,a
источник

LW

Loren White in Ассемблер
и что в 'а' находится ? в масме ведь [] используются для взятия значения по адресу, т.е. без них сам указатель возьмешь, не ?
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
Loren White
и что в 'а' находится ? в масме ведь [] используются для взятия значения по адресу, т.е. без них сам указатель возьмешь, не ?
не, в масме чтоб адрес взччть нужно offset поставить. а или [a] возьмет только значение вроде
источник

LW

Loren White in Ассемблер
надо будет проверить )0 а то я засомневался
источник

LW

Loren White in Ассемблер
а почему при линковке через g++ .o файла сделанного NASM выдается такая ошибка ? и как насмом сделать позиционно независимый код ?

foo.o: relocation R_X86_64_32S against '.rdata' can not be used when making a PIE object; recompile with -fPIE
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
линухом не балуюсь, не знаю
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
а что значит позиционно независимый код?
источник

LW

Loren White in Ассемблер
вроде как это код, который может загрузиться в любые участки памяти и при этом сохранить работоспособность
источник

A

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

LW

Loren White in Ассемблер
т.е. наверна нельзя вычислить постоянных смещений относительно какой то части программы
источник

LW

Loren White in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮
прям таки в любые?
я сам только сейчас узнал, что вообще существуют PIE программы, понятия не имею )0
источник

A

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

A

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

ВК

Владимир Кузнецов... in Ассемблер
Loren White
а почему при линковке через g++ .o файла сделанного NASM выдается такая ошибка ? и как насмом сделать позиционно независимый код ?

foo.o: relocation R_X86_64_32S against '.rdata' can not be used when making a PIE object; recompile with -fPIE
Недавно разобрался с этим, через минут 20 подскажу
источник

LW

Loren White in Ассемблер
о, ждемс
источник

ВК

Владимир Кузнецов... in Ассемблер
Loren White
о, ждемс
В общем, когда код собирается под x86-64, то в относительно свежих дистрибутивах Linux включен ASLR
https://ru.wikipedia.org/wiki/ASLR
Который требует, чтобы ассемблерный код был позиционно независимым https://ru.bmstu.wiki/PIE_(Position_Independent_Execution)

Самый простой вариант - указать gcc флаг -no-pie - тогда не будет требоваться, чтобы ассемблерный код был позиционно независимым.

Либо можно подправить код в стиле RIP-relative адресации, например вместо такого:
.data

hello_str:
       .asciz "Hello, world!\n"
       .set hello_str_length, . - hello_str - 1

.text
.global  main

main:
   movq $1, %rax
   movq $1, %rdi
   movq $hello_str, %rsi
   movq $hello_str_length, %rdx
   syscall

   movq $60, %rax
   movq $0, %rdi
   syscall

переписать так:
.data

hello_str:
       .asciz "Hello, world!\n"
       .set hello_str_length, . - hello_str - 1


.text
.global  main

main:
   mov $1, %rax
   mov $1, %rdi
   lea hello_str(%rip), %rsi
   mov $hello_str_length, %rdx
   syscall

   mov $60, %rax
   mov $0, %rdi
   syscall
источник

s

s54816 in Ассемблер
Владимир Кузнецов
В общем, когда код собирается под x86-64, то в относительно свежих дистрибутивах Linux включен ASLR
https://ru.wikipedia.org/wiki/ASLR
Который требует, чтобы ассемблерный код был позиционно независимым https://ru.bmstu.wiki/PIE_(Position_Independent_Execution)

Самый простой вариант - указать gcc флаг -no-pie - тогда не будет требоваться, чтобы ассемблерный код был позиционно независимым.

Либо можно подправить код в стиле RIP-relative адресации, например вместо такого:
.data

hello_str:
       .asciz "Hello, world!\n"
       .set hello_str_length, . - hello_str - 1

.text
.global  main

main:
   movq $1, %rax
   movq $1, %rdi
   movq $hello_str, %rsi
   movq $hello_str_length, %rdx
   syscall

   movq $60, %rax
   movq $0, %rdi
   syscall

переписать так:
.data

hello_str:
       .asciz "Hello, world!\n"
       .set hello_str_length, . - hello_str - 1


.text
.global  main

main:
   mov $1, %rax
   mov $1, %rdi
   lea hello_str(%rip), %rsi
   mov $hello_str_length, %rdx
   syscall

   mov $60, %rax
   mov $0, %rdi
   syscall
Какой интересный насм!
источник