Четвертая лекция

Самая простая программа

	.model tiny
	.code
	org	100h
start:
	ret
end start

Не делает ничего)

2 шага:

  1. тексты превращаются в модули
  2. модули собираются в исходник

Hello, World!

​ Создадим файл “1.s”

#Это для 32-битных систем
.globl _start #Можно .global(без разницы)
.text
# комментарий через #
# абсолютные значения(чиселки) через $
# Регистры через %
_start:
	mov	$4, %eax #функция write имеет опкод 4
	mov $1, %ebx
	mov %messg, %ecx
	mov %lmessg, %edx
	int %0x80
	
	
	mov $1, %eax		#код
	xor	%ebx, %ebx		#завер-
	int $0x80			#шения

.data
messg:	.ascii "Hello, World!\n"
		#.byte 10 - Можно юзать вместо переноса строки (сам переведёт строку дважды)
lmessg = . - messg #вычисляет разницу между указателем на .data и указателем на messg (т.е. длину строки)

ARWX - (A - allocated, R - readable, W - writable, X executable)

К функциям ОСи можно обращаться int 0x80(для всех) и syscall для 64-битных систем

syscall намного быстрее, но “портятся” регистры

Узнать параметры можно с помощью man, например man exit

Параметр syscall берётся из регистра eax и результат кладётся туда же

as -o 1.o 1.s //команда трансляции из 1.s в 1.o
ld -o 1 1.o   //команда компоновки 1.o
./1			  //команда запуска 

Перепишем программу для 64-битной системы (с использованием syscall)

#Это для 64-битных систем
.globl _start 
.text
_start:
	mov	$1, %eax
	mov $1, %edi
	mov %messg, %esi
	mov %lmessg, %edx
	syscall
	
	
	mov $60, %eax		
#	xor	%ebx, %ebx
	mov $37, %edi
	int $0x80			

.data
messg:	.ascii "Hello, World!"
		.byte 10
lmessg = . - messg

Программа для сборки компилятором C

​ Для простоты назовём 2.s

​ Просто заменяем _start на main, добпаляем в первую строку push %rbp, в последнюю и всё работает:)

#Это для 64-битных систем
.globl main 
.text
main:
	push %rbp
	mov	$1, %eax
	mov $1, %edi
	mov %messg, %esi
	mov %lmessg, %edx
	syscall
	
	
	pop %rbp
    ret

.data
messg:	.ascii "Hello, World!"
		.byte 10
lmessg = . - messg

Компиляция и запуск сишным компилером:

gcc -o 2 2.s
./2