Перейти к содержимому

Фотография

Assembler Linux mmap


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1
RedLiner

RedLiner
  • Гость
  • 18 сообщений
Всем привет!
При вызове mmap(); прога выдает отрицательное число но сам файл открывается и смещение выполняется
// filename - asciiz

open_file:
	mov	eax,SYS_open
	mov	ebx,filename
	mov	ecx,O_RDWR
	int	0x80
	cmp	eax,0xFFFFF000
	ja	exit

	xchg eax,ebx
	
	mov	eax,SYS_lseek // lseek(fd,0,2);
	mov	ecx,0
	mov	edx,2

	int	0x80

	xchg eax,edx
	
	push ebx

	push 0
	push ebx
	push 1
	push 3
	push edx
	push 0
	mov	eax,SYS_mmap // mmap(0,edx/*file size*/,PROT_READ|PROT_WRITE,MAP_SHARED,ebx/*filedecrypter*/,0);
	mov	ebx,esp
	int	0x80
	add esp,byte 24
	pop	ebx

exit:
	mov	eax,1
	xor	ebx,ebx
	int	0x80

  • 0

#2
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

Всем привет!
При вызове mmap(); прога выдает отрицательное число но сам файл открывается и смещение выполняется

man errno, strerror, etc
Если уж пишешь на ассеммблере - пиши нормально. На ошибки надо проверять после каждого сисколла. А ещё лучше дурью не майся и пиши на C :) Я тебе уверяю, аналогичный код на C будет скомпилирован в более эффективный ассемблерский код, чем ты написал.
  • 0

#3
RedLiner

RedLiner
  • Гость
  • 18 сообщений
Если пишу на асме значит так надо
Если умный такой то скажи как сделать чтобы С прога компилилась без libc?
но не путем указания -static
и что не эффективного ты видишь?
  • 0

#4
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

Если умный такой то скажи как сделать чтобы С прога компилилась без libc?

Если ты имел в виду "линковалась", то -nostdlib вроде.

но не путем указания -static

А это тут при чём?

и что не эффективного ты видишь?

mov ecx,0

после этого я уже не смотрел. Ты не умеешь писать эффективный код на ассемблере.
  • 0

#5
RedLiner

RedLiner
  • Гость
  • 18 сообщений
придет со временем способность писать эфективный код
  • 0

#6
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

придет со временем способность писать эфективный код

Ну дело твоё конечно. Просто есть такой общепризнанный факт, что компилятор С в 99% случаев создаёт более эффективный код, чем человек. Чтобы писать код лучше - надо быть ОЧЕНЬ крутым профи. И этот код пишут под всякие встроенные устройства с килобайтом памяти и процессором с мегагерцом частоты. Ну это так, лирика. Ты errno то проверь после вызова - узнаешь, в чём проблема, специально ведь придумали.
  • 0

#7
RedLiner

RedLiner
  • Гость
  • 18 сообщений
аналогичный код на С работает как часы
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
	int fd;
	fd = open(argv[1], O_RDWR);

	if(fd == (-1)){
	write(1,"error\n",6);
	return -1;
	}
	else write(1,"suc\n",4);

	int size;
	size = lseek(fd,0,2);
	if(size == (-1))
	{	
	write(1,"error\n",6);
	return -1;
	}
	
	void *ptr;

	ptr = (void *)mmap(0,size,3,1,fd,0);
	if((int)ptr == (-1))
	{
	write(1,"err0r\n",6);
	return -1;
	}
	printf("%d\n",errno);
	return 0;
}

Да я понимаю что компилятор создаст код лучше но мне просто интересно делать это самому =)
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.