Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2013, 13:33   #1
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию Вопрос по коду

Здравствуйте, я начинающий, поэтому просил бы объяснить более полно.
#include <stdio.h>
#include <windows.h>

//Пересылка данных
//Переменные
DWORD a,b,c,d,e,f,g,h;

void main()
{
f=200;
__asm
{
//Непосредственная передача
mov a,100
mov eax,100
mov b,eax
//Использование косвенной адресации
lea ebx,c
mov dword ptr [ebx],eax
//Использование стека
//Содержимое eax оказывается в e число 100 в d
push eax
push 100
pop d
pop e
//команда xchg (обмен содержимым операндов),
//содержимое f переходит в g
xchg eax,f
xchg g,eax
//сложение с предварительным обменом операндов
mov eax,50
mov eax,20
xadd eax,ebx
//Теперь сумма в eax, а число 20 в h
};
printf("%u %u %u %u %u %u %u %u %u\n",a,b,c,d,e,f,g,h);

system("pause");
}
Конкретно из кода возникает вопрос:
//Использование стека
//Содержимое eax оказывается в e число 100 в d
push eax
push 100
pop d
pop e

почему после сохранения в стеке eax, оказывается в переменной e и соответственно число 100 в переменной d?
Также интересуют инструкции:
//Использование косвенной адресации
lea ebx,c ;- получение адреса переменной c
mov dword ptr [ebx],eax ; здесь как я понимаю в регистре ebx хранится адрес ячейки памяти и по этому адресу записывается содержимое регистра eax
Объясните пожалуйста.
С Уважением Алексей.
Alexey_68 вне форума Ответить с цитированием
Старый 01.03.2013, 14:28   #2
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

По поводу стека все правильно. По принципу: посленим положил - первым забрал.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Старый 01.03.2013, 15:07   #3
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

спасибо за ответ, но интересует почему именно в переменные d и e, eax в e, а число 100 в переменную d?
Alexey_68 вне форума Ответить с цитированием
Старый 01.03.2013, 15:46   #4
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
eax в e, а число 100 в переменную d?
потому что ПОСЛЕДНИМ ПОЛОЖИЛ - ПЕРВЫМ ЗАБРАЛ

положил eax
положил 100
взял 100 в d
взял eax в е
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 01.03.2013, 16:44   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
//Использование косвенной адресации
lea ebx,c ;- получение адреса переменной c
mov dword ptr [ebx],eax ; здесь как я понимаю в регистре ebx хранится адрес ячейки памяти и по этому адресу записывается содержимое регистра eax
ключевая инструкция здесь lea ebx,c - здесь мы загружаем смещение переменной c в сегменте. после этого мы можем обращаться к ячейке через её смещение, как в следующей строке. В этом и есть смысл косвенной адресации - доступ к ячейке памяти идет не через постоянное смещение, а через смещение, хранящееся в регистре (которое в случае необходимости можно корректировать).
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 01.03.2013, 18:34   #6
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

to:Ezhik Kihze
это понятно, я неправильно поставил вопрос, почему именно в эти переменные, а не в h или g или с?
или если я правильно понял, я мог бы написать например:
push eax
push 100
pop h
pop s
Содержимое eax оказывается в s, а число 100 в h?
Всё правильно тему усвоил, всем огромное спасибо!
С Уважением Алексей.

Последний раз редактировалось Alexey_68; 01.03.2013 в 22:37.
Alexey_68 вне форума Ответить с цитированием
Старый 02.03.2013, 00:19   #7
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
почему именно в эти переменные, а не в h или g или с?
Потому что так захотела левая пятка правой ноги программиста...
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по коду игры pavelvolkov73 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 21.11.2012 15:42
Pascal, вопрос по коду. Wizard_Adeptus Помощь студентам 2 22.05.2012 11:00
Вопрос по коду программы на С++. Проверить. AlekCaHdpyLLlka Помощь студентам 5 11.05.2012 18:24
Вопрос по коду BeZone Помощь студентам 10 28.12.2009 13:21
Вопрос по коду(Pascal) DeFt Помощь студентам 6 09.06.2009 21:20