Size: a a a

Ассемблер

2021 August 19

D

Den in Ассемблер
Екземпл как построить избушку без единого гвоздя или как написать код на асме без единого мув :)
источник

D

Den in Ассемблер
Вот я тут писал когда то это на асме работа с башем, там файлик создается и буква туда пишется, через баш:           Ура заработало, я что то упустил, что в линуксе echo это файл, в общем вот так:
execve("/bin/echo", ["/bin/echo", "\"51\""], [/* 0 vars */]) = 0

BITS 32
section .text
global _start
_start:
push edx
push 0x22313522
mov edi, esp
push edx
push 0x0000006f
push 0x6863652f
push 0x6e69622f
mov ebx, esp
push edx
push edi
push ebx
mov ecx, esp
xor eax, eax
mov al,11
int 0x80
mov eax, 1
int 0x80
источник

D

Den in Ассемблер
файл будет в каталоге с программой
источник

ВВ

Вячеслав Васютин... in Ассемблер
Почему в nasm  все с push начинается? Зачем все сразу в стек ложить?
источник

D

Den in Ассемблер
да это я с shell кодами эксперементировал, так там пушаться аргументы конечно для execve
источник

d

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

ВВ

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

D

Den in Ассемблер
nasm
источник

d

disba1ancer in Ассемблер
ясн
источник

ВВ

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

format ELF64 executable

segment readable executable

globmetka1:
.locmetka1 db "Hi Slava! ",0
.locmetkaSizeOflocmetka1 db $-.locmetka1

jmp globmetka2.locmetka4
syscall



globmetka2:
.locmetka2 db "What will make ", 0
.locmetka3 db "2+2?😊", 10, 0
          mov rax, 1
          mov rdi, 1
          mov rsi, globmetka1.locmetka1
          mov rdx, .locmetkaSizeOflocmetka1
источник

ВВ

Вячеслав Васютин... in Ассемблер
Просто пытаюсь с меткаии немного попрактиковаться
источник

E

Entusiast in Ассемблер
Не знал, что есть готовый для этого сисколл
источник

D

Den in Ассемблер
ну вот да есть!
источник
2021 August 20

ВВ

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

E

Entusiast in Ассемблер
Нет.
источник

E

Entusiast in Ассемблер
Почитай ещё книгу какую-то про ассемблер. Ты всё-таки не до конца понимаешь, на каком уровне ты пишешь, и что пишешь
источник

s

s54816 in Ассемблер
.intel_syntax noprefix

.macro .mystr name:req value:vararg
   \name:
       .irp x,\value
           .ascii "\x"
       .endr
       .byte 0
   .equ \name\().length, . - \name
.endm

.text
       mov eax,offset somestring.length
       ret

.data
       .mystr somestring, "hello, world", "test"

Почему offset? Потому что GNU, вот почему. Какое же у них всё рептилоидное, каждый раз страшно.
источник

E

Entusiast in Ассемблер
В исполняемом сегменте ты пишешь:
0x400000: globmetka1:
0x400000: globmetka1.locmetka1: 69 48 73 20 61 6c 61 76 20 21 00 00
0x400024: .globmetka1.sizeofMetka1: 24
E9 globmetka2.locmetka4
0F05


По итогу, ОС передаёт первую инструкцию из исполняемого сегмента.
Но никакой инструкции там нет, это ASCII коды.
А процессор это знает? С горем пополам он обработает:
0x00000000      486920736c61.  imul rsp, qword [rax], 0x76616c73
0x00000007      61             invalid

И потом сразу же ОС выбьет seg fault.

Тебе нужно ставить весь текст далеко от исполняемого кода. А если и пришлось вставить в исполняемый код - тогда перепрыгивай его:

jmp text_end
text: db "Hello!", 0
text_end:
; code

Потому что для процессора всё - инструкции, и посреди этих инструкций (каши) 100% тебе вернётся seg fault.
источник

s

s54816 in Ассемблер
Да оно не скомпилируется, нечего беспокоиться.
источник

ВВ

Вячеслав Васютин... in Ассемблер
Т.е. ASCII нужно в др. секцию ложить?
источник