LINUX.ORG.RU

[asm][c]Содержимое регистра cs

 ,


0

1

При вызове любой подпрограммы в стек кладётся адрес «родителя». Путём банального эксперимента было установлено, что регистр eip сохраняется по адресу esp+4 в стеке. По идее cs должен быть сохранён по адресу esp. Для этого я так же решил провести эксперимент. Вот программа.

foo.s:

.code32
.globl cs_par, cs
.text

cs_par:
	pushl	%ebp
	movl	%esp,%ebp
	movl	(%ebp),%eax
	popl	%ebp
	ret

cs:
	xorl	%eax,%eax
	movw	%cs,%ax
	ret
call.c
#include <stdio.h>

extern int cs_par (void);
extern int cs (void);

int main ()
{
	printf ("cs_par = %X ", cs_par ());
	printf ("cs = %X ",cs ());
	return 0;
}
Выхлоп проги:
cs_par = BFD8F228 cs = 73 
Внимание, вопрос. Почему cs_par != cs?

★★★★★

ты под тяжелыми веществами, или только сегодня утром начал учить ассемблер?..

arsi ★★★★★
()
Ответ на: комментарий от luke

Не похоже - да :)
Просто вывело всего один байт, вот я те маску и показал что бы выводило 4 байта )

Jetty ★★★★★
()
Ответ на: комментарий от luke

> Ни то, ни другое. Где косяк?

Нет, что-то одно из двух. Погугли самостоятельно про разницу между «Far call» и «Near call».

fang
()
Ответ на: комментарий от luke

> Ок, если это near call, то тогда что находится в (%esp)?

Вне зависимости от того, какой это тип передачи управления, в ESP хранится смещение указателя стека относительно начала сегмента стека.

fang
()
Ответ на: комментарий от luke

> Ну дык всё в одном сегменте

молодец. а теперь объясни, на кой фиг передавать при вызове сегментный регистр, если «всё в одном сегменте»?

arsi ★★★★★
()
Ответ на: комментарий от arsi

Единственно для того, чтобы в (%esp) было что-нибудь полезное :)

luke ★★★★★
() автор топика
Ответ на: комментарий от fang

Не то ответил. Очевидно, в (%ESP) хранится адрес возврата — только смещение. Селектор в стек не кладётся при ближнем переходе.

fang
()
Ответ на: комментарий от fang

Адрес возврата хранится в 4(%esp) - это экспериментально проверено. Хотя щас посмотрим.

luke ★★★★★
() автор топика
Ответ на: комментарий от anonymous
as -v
GNU assembler version 2.20 (i486-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20
^C
luke ★★★★★
() автор топика

ояеу!!!!!!

афтар, раскрою тебе страшную тайну

cs_par возвращает тебе адрес в стеке по которому лежит возврата! esp указывает на последний pushнутый dword или qword в зависимости от 32 или 64.

[esp]=return addr;

ты pushнул значение esp сразу после того как отработал call

после этого поместил в eax то, что было по адресу [esp] -то есть текущий esp-4

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

Ситх подери!

Я тупица

luke ★★★★★
() автор топика

можно было и без асемблера :)

__buildin_return_address(0) - адрес возврата

__buildin_frame_address(0) - фрейм стека

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.