Ассемблер и ассемблерные вставки
|
|
lamama | Дата: Вторник, 07.04.2009, 21:25 | Сообщение # 1 |
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Статус: Offline
| Вместе с Артуром Худяевым читаю сечас дисциплину "Язык программрования Ассемблер". При подготовке к лекциям узнал много нового для себя. Первое, что меня обрадовало - программа, размером 22 байта, написанная в дебагере (подробнее читайте тут): Quote -a 100 100 mov ah,09 102 mov dx,0108 105 int 21 107 ret 108 db "Hello, world$" -n C:\hello.com w -q Первые две строчки для прерывания "int 21", печатающего сообщение после db (в регистр ah заносится номер функции, в регистр dx адрес начала блока данных db). Позже расскажу про особенности ассемблерных компиляторов и ассемблерных вставок для различных компиляторов (самого поразило различие между VC++ и g++).
Не оседать, не приживаться - Ступенька за ступенькой - без печали, Шагать вперед, идти от дали к дали, Все шире быть, все выше подниматься.
|
|
| |
eXceed | Дата: Вторник, 07.04.2009, 22:55 | Сообщение # 2 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Фор фан. Злой драйвер на asm из собственной тачанки жести. Quote .386 .model flat, stdcall option casemap: none include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .code DriverEntry proc pDriverObject:DWORD, pusRegistryPath:DWORD ;mov al, 0FEh ;out 64h, al xor eax, eax xchg [eax], eax DriverEntry endp end DriverEntry Вешает машину при запуске. Компилировать масмом. lamama Самая короткая программа в мире занимает всего два байта и эти байты такие: cd20 Внимание вопрос: Что она делает?
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
Сообщение отредактировал eXceed - Вторник, 07.04.2009, 22:57 |
|
| |
BoSSurman | Дата: Среда, 08.04.2009, 00:49 | Сообщение # 3 |
Корифей
Группа: Модераторы
Сообщений: 674
Статус: Offline
| Quote (eXceed) Самая короткая программа в мире занимает всего два байта и эти байты такие: cd20 Внимание вопрос: Что она делает? Ничего. Завершается. cd20 = int 20
:-P
|
|
| |
eXceed | Дата: Среда, 08.04.2009, 00:59 | Сообщение # 4 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| BoSSurman Ответ не верный. Она КОРРЕКТНО завершает работу и КОРРЕКТНО выгружается из памяти. Почти правильно сказал.
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
lamama | Дата: Среда, 08.04.2009, 10:05 | Сообщение # 5 |
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Статус: Offline
| Quote (eXceed) Самая короткая программа в мире занимает всего два байта и эти байты такие: cd20 Я не претендовал на самую короткую программу . Я просто делился впечатлениями. Кстати, когда пытался упаковать свою программу hello.com архиватором - результат получился обратный - она увеличилась до 142 байт .
Не оседать, не приживаться - Ступенька за ступенькой - без печали, Шагать вперед, идти от дали к дали, Все шире быть, все выше подниматься.
|
|
| |
vitalyu | Дата: Среда, 08.04.2009, 11:42 | Сообщение # 6 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Quote (lamama) Вместе с Артуром Худяевым читаю сечас дисциплину "Язык программрования Ассемблер". Советую посмотреть методичку и задания у Дмитрия Полуботко (сын В.А.). У него отличные лекции и практика были, жаль, что больше не преподает у нас. Если нужно - могу скинуть на мыло ..
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
|
|
| |
saginsa | Дата: Среда, 08.04.2009, 13:08 | Сообщение # 7 |
Генерал-полковник
Группа: Модераторы
Сообщений: 864
Статус: Offline
| мне пожалуйста
"Я планировала, но не думала ..."
|
|
| |
BoSSurman | Дата: Среда, 08.04.2009, 14:34 | Сообщение # 8 |
Корифей
Группа: Модераторы
Сообщений: 674
Статус: Offline
| Quote (eXceed) Ответ не верный. Она КОРРЕКТНО завершает работу и КОРРЕКТНО выгружается из памяти. ога
:-P
|
|
| |
eXceed | Дата: Среда, 08.04.2009, 15:22 | Сообщение # 9 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| А вот не совсем корректный выход будет invoke TerminateProcess, 0 После этого будет множество мусора в памяти. А вообще у Полуботко младшего очень хорошие лекции по асму и С. Надо быть полным идиотом, чтоб не понять их.
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
Сообщение отредактировал eXceed - Среда, 08.04.2009, 15:23 |
|
| |
lamama | Дата: Воскресенье, 12.04.2009, 23:28 | Сообщение # 10 |
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Статус: Offline
| Продолжим. Решил я изучить маленько ассемблерные вставки. Всегда считал, что для любого c или c++ ассемблерная вставка, которая присваивает делает одну простую операцию j2=j1 должна выглядеть так: Quote _asm { mov eax, j1 mov j2,eax } При попытке написать подобный код под компилятор gcc получил "от ворот поворот", поэтому "засел" за изучение документации, в результате чего был "рожден" следующий код (синтаксис AT&T, поэтому источник и приемник идут в обратном порядке): Quote asm("mov %0, %%eax;" // пересылка в регистр eax "mov %%eax, %1;" // выгрузка из регистра eax : "=r" (j2) // выгрузку из регистра eax производить в j2 : "r" (j1) // в регистр eax поместить переменную j1 : "%eax"); // используемый регистр Вот такие интересные "пироги".
Не оседать, не приживаться - Ступенька за ступенькой - без печали, Шагать вперед, идти от дали к дали, Все шире быть, все выше подниматься.
|
|
| |
vitalyu | Дата: Понедельник, 13.04.2009, 01:16 | Сообщение # 11 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Quote (vitalyu) Советую посмотреть методичку и задания у Дмитрия Полуботко (сын В.А.). У него отличные лекции и практика были, жаль, что больше не преподает у нас. Если нужно - могу скинуть на мыло .. Ссылка на архив с доками (там даже часть задач решенные есть от maestRo)
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
Сообщение отредактировал vitalyu - Понедельник, 13.04.2009, 01:18 |
|
| |
vitalyu | Дата: Понедельник, 13.04.2009, 01:25 | Сообщение # 12 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Quote (lamama) При попытке написать подобный код под компилятор gcc получил "от ворот поворот" в GCC есть специальный параметр -S .. Попробуйте, ради интереса, скомпилить простенький С код с этим параметром =) После загляните в файлик *.s А вообще, в GCC есть такая вещь, как GAS (GNU Assembler Syntax), т.е. есть алиасы для вызова asm-функций .. В Delphi своя фишка: asm end;
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
|
|
| |
lamama | Дата: Понедельник, 13.04.2009, 14:17 | Сообщение # 13 |
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Статус: Offline
| Quote (vitalyu) в GCC есть специальный параметр -S .. Знаю. Такая фишка есть у всех компиляторов. Quote (vitalyu) А вообще, в GCC есть такая вещь, как GAS (GNU Assembler Syntax), т.е. есть алиасы для вызова asm-функций .. На нем и написаны ассемблерные вставки, компилируемые gcc .
Не оседать, не приживаться - Ступенька за ступенькой - без печали, Шагать вперед, идти от дали к дали, Все шире быть, все выше подниматься.
|
|
| |
vitalyu | Дата: Среда, 15.04.2009, 01:21 | Сообщение # 14 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Quote (lamama) в результате чего был "рожден" следующий код А этот следующий код что в gcc завелся??? Quote (lamama) На нем и написаны ассемблерные вставки, компилируемые gcc Дык, иначе бы он и не нужен был ..
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
Сообщение отредактировал vitalyu - Среда, 15.04.2009, 01:23 |
|
| |
lamama | Дата: Пятница, 17.04.2009, 09:07 | Сообщение # 15 |
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Статус: Offline
| Quote (vitalyu) А этот следующий код что в gcc завелся??? Ниже исходники (в виде отдельной функции): Quote (main.cpp) #include <cstdlib> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int Pr1(int j1) { int j2; asm("mov %0, %%eax;" "mov %%eax, %1;" : "=r" (j2) : "r" (j1) : "%eax"); return j2; } extern "C" { int Pr2(int j1); } int main(int argc, char *argv[]) { int i,j,j1; printf("i="); scanf("%d",&i); j=Pr1(i); j1=Pr2(i); printf("i=%d j=%d j1=%d\n",i,j,j1); system("PAUSE"); return EXIT_SUCCESS; } Функция Pr2 - внешняя: Quote (Pr2.s) .globl _Pr2 .def _Pr2; .scl 2; .type 32; .endef _Pr2: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %edx mov %edx, %eax; mov %eax, %edx; movl %edx, %eax movl %eax, -4(%ebp) leave ret Компиляция следующими командами (выдрал из Make-файла): Quote g++ -c main.cpp -o main.o g++ -c Pr2.s -o Pr2.o g++ main.o Pr2.o -o test.exe
Не оседать, не приживаться - Ступенька за ступенькой - без печали, Шагать вперед, идти от дали к дали, Все шире быть, все выше подниматься.
|
|
| |