LINUX.ORG.RU

Asm


0

0

Я решил научиться писать на асме. И вот кусок моей первой программы:

... dot db ".",0 ... mov ecx,10 next: push dot call printf loop next Этот кусочек должен напечатать 10 точек. А он их печатает бесконечное количество. Где ошибка?

Второй вопрос: где функции (в каком регистре, или может стеке) сохраняют возвращаемое значение? И как обратиться к errno? Пишу в nasm. Заранее спасибо!

anonymous

Я решил научиться писать на асме. И вот кусок моей первой программы:

...
dot db ".",0
...
mov ecx,10
next:
push dot
call printf
loop next

Этот кусочек должен напечатать 10 точек. А он их печатает бесконечное количество. Где ошибка?


Второй вопрос: где функции (в каком регистре, или может стеке) сохраняют возвращаемое значение? И как обратиться к errno? Пишу в nasm.

Заранее спасибо!

anonymous
()

Я решил научиться писать на асме. И вот кусок моей первой программы:

...
dot db ".",0
...
mov ecx,10
next:
push dot
call printf
loop next

Этот кусочек должен напечатать 10 точек. А он их печатает бесконечное количество. Где ошибка?


Второй вопрос: где функции (в каком регистре, или может стеке) сохраняют возвращаемое значение? И как обратиться к errno? Пишу в nasm.

Заранее спасибо!

anonymous
()

Я решил научиться писать на асме. И вот кусок моей первой программы:

...
dot db ".",0
...
mov ecx,10
next:
push dot
call printf
loop next

Этот кусочек должен напечатать 10 точек. А он их печатает бесконечное количество. Где ошибка?


Второй вопрос: где функции (в каком регистре, или может стеке) сохраняют возвращаемое значение? И как обратиться к errno? Пишу в nasm.

Заранее спасибо!

anonymous
()

Вызов функции в общем виде выглядит так:
push arg2
push arg1
push arg0
call fn
add esp,12
mov [retval],eax

Аналог вышеприведенного кода на Си:
retval = fn(arg0, arg1, arg2);

1) Параметры передаются через стек в обратном порядке (самый первый параметр кладется на стек в последнюю очередь).

2) После того, как вызванная функция отработала, переданные ей параметры должны быть сняты со стека. Это делает вызывающий.

3) Целые значения возвращаются функцией в регистре:
byte - AL
word - AX
dword - EAX
qword - EDX:EAX

4) Функция в процессе работы может изменять следующие регистры:
EAX
ECX
EDX
EFLAGS (те биты, которые разрешает менять OS)
Прочие регистры (если они нужны) должны быть сохранены перед изменением, а перед выходом -- восстановлены.

Все вышесказанное относится только к интерфейсу с Си/Си++. В других языках могут быть другие соглашения о вызовах функций.

Рекомендую нужную тебе функцию реализовать сначала на Си и пропустить ее через компилятор -- пускай он сделает тебе ассемблерный файл. Для gcc это опция -S.

Подробнее о gcc можно прочитать по команде `info gcc'. Вместе с nasm идет дока, содержащая массу полезной информации. Рекомендую к прочтению. Есть HOWTO. Называется Assembly-HOWTO (если мне не изменяет память). Тоже рекомендуется почитать.

Насчет errno не все так с краю. Вот код на Си:
#include <stdio.h>
#include <errno.h>
int main()
{
return printf("%d\n", errno);
}

Преобразуем его в текст на ассемблере:
gcc -S file.c

Смотрим в file.s и видим там следующее:
call __errno_location
movl (%eax),%eax

Последняя строчка с использованием синтаксиса Intel будет выглядеть так:
mov eax,[eax]
Т.е. функция __errno_location возвращает адрес переменной errno. Для того, чтобы считать ее значение в регистр EAX, можно использовать приведенную выше строчку.

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

А стек чистить будет великий русский поэт Пушкин?

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

Ой не лги царю паскальщик! :) Сишные функции (особливо с переменным числом аргументов, как printf) не чистят за собой стек.

anonymous
()

Всем спасибо за ответы!!

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