Size: a a a

Ассемблер

2019 November 24

O

Oz in Ассемблер
Подскажите что означает E N W Q
источник

Н

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

Н

Никита in Ассемблер
100% там милион дефайнов
источник

O

Oz in Ассемблер
Спасибо
источник
2019 November 25

P

Prudya in Ассемблер
Использую NASM+Си. Имеется вот такой код:
regSetEAX.asm:
regSetEAX:
 mov eax, [esp + 4]
 ret
main.c:
int main()
{
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(255);
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(0);
 printf("eax: %08X\n", regGetEAX());

 printf("eax: %08X\n", regGetEAX());


 return 0;
}

На терминале:
eax: F7F9C7C8
eax: 000000FF
eax: 00000000
eax: 0000000E
eax: 0000000E

Почему меняется состояние регистра? И можно ли как-то его сохранить?
источник

楽園松本 in Ассемблер
Prudya
Использую NASM+Си. Имеется вот такой код:
regSetEAX.asm:
regSetEAX:
 mov eax, [esp + 4]
 ret
main.c:
int main()
{
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(255);
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(0);
 printf("eax: %08X\n", regGetEAX());

 printf("eax: %08X\n", regGetEAX());


 return 0;
}

На терминале:
eax: F7F9C7C8
eax: 000000FF
eax: 00000000
eax: 0000000E
eax: 0000000E

Почему меняется состояние регистра? И можно ли как-то его сохранить?
Когда ты вызываешь функцию, она создаёт свой контекст, и после выхода из функции контекст разрушается.
источник

楽園松本 in Ассемблер
Обозначь переменные как глобальные.
источник

P

Prudya in Ассемблер
楽園松本
Обозначь переменные как глобальные.
Какие именно?
источник

楽園松本 in Ассемблер
Prudya
Какие именно?
Давай рассуждать логически. В eax ты загружаешь число. После этого выходишь. Разве можно быть уверенным, что eax сохранится?
источник

P

Prudya in Ассемблер
Тоесть, хранить значение eax в отдельной переменной, значение которой потом записывать в регистр при надобности?
источник

楽園松本 in Ассемблер
Prudya
Тоесть, хранить значение eax в отдельной переменной, значение которой потом записывать в регистр при надобности?
Обозначь в сишной программе глобальную переменную. И её адрес передавай асмовому коду. Но это плохая практика. Лучше передай асмовому коду через стек значение, делай работу в асмовом коде и возвращай через стек значение в сишную программу.
источник

P

Prudya in Ассемблер
楽園松本
Обозначь в сишной программе глобальную переменную. И её адрес передавай асмовому коду. Но это плохая практика. Лучше передай асмовому коду через стек значение, делай работу в асмовом коде и возвращай через стек значение в сишную программу.
А смысл тогда?
источник

L

Leon in Ассемблер
Prudya
Использую NASM+Си. Имеется вот такой код:
regSetEAX.asm:
regSetEAX:
 mov eax, [esp + 4]
 ret
main.c:
int main()
{
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(255);
 printf("eax: %08X\n", regGetEAX());

 regSetEAX(0);
 printf("eax: %08X\n", regGetEAX());

 printf("eax: %08X\n", regGetEAX());


 return 0;
}

На терминале:
eax: F7F9C7C8
eax: 000000FF
eax: 00000000
eax: 0000000E
eax: 0000000E

Почему меняется состояние регистра? И можно ли как-то его сохранить?
Если ты пытаешься хранить свою личную переменную в каком то регистре то это невозможно. Большенство регистров интенсивно  используются в  том коде который получается при компиляции.
источник

P

Prudya in Ассемблер
Это из-за многозадачности ОС?
источник

P

Prudya in Ассемблер
Просто я сейчас основываюсь на ДОСовском Debug, где была возможность менять значения регистров процессора. Или это всё-таки было "обманкой"?
источник

L

Leon in Ассемблер
Prudya
Это из-за многозадачности ОС?
Это из-за сути того как работает любой компилятор языка высокого уровня и архитектуры процессора тоже естественно
источник

P

Prudya in Ассемблер
Leon
Это из-за сути того как работает любой компилятор языка высокого уровня и архитектуры процессора тоже естественно
Я не про это немного.
источник

P

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

L

Leon in Ассемблер
Prudya
Просто я сейчас основываюсь на ДОСовском Debug, где была возможность менять значения регистров процессора. Или это всё-таки было "обманкой"?
Не понимаешь сути. регистры процессора Действительно существуют Их действительно можно менять в какой-то момент времени . Но когда у тебя есть код на языке высокого уровня например ветвления и потом какой-нибудь цикл , то когда ты посмотришь Во что компилятор превращает эту программу то ты увидишь многочисленные загрузки из памяти в регистры, сравнения, какие-то переходы, выгрузки из регистров в память. скажем 5-6 команд процессорп на ветвление и может быть столько же или чуть больше на какой-нибудь цикл. И для каждой одной строчкой на языке си , ты увидишь какие-либо команды которые используют одни и те же регистры снова и снова используя каждый раз их по-новому.
источник

P

Prudya in Ассемблер
Программа DEBUG позволяет делать дампы памяти, вручную вносить непосредственные изменения. Также есть возможность записывать данные в регистры.

Я так понимаю, что про регистры авторы программы наврали?
источник