[ Обновленные темы · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Ассемблер и ассемблерные вставки
lamamaДата: Вторник, 07.04.2009, 21:25 | Сообщение # 1
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: 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++).
Прикрепления: HELLO.com (0.0 Kb)


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
eXceedДата: Вторник, 07.04.2009, 22:55 | Сообщение # 2
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: 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
Репутация: 65
Статус: Offline
Quote (eXceed)
Самая короткая программа в мире занимает всего два байта и эти байты такие: cd20 Внимание вопрос: Что она делает?

Ничего. Завершается. cd20 = int 20 smile


:-P
 
eXceedДата: Среда, 08.04.2009, 00:59 | Сообщение # 4
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
BoSSurman

Ответ не верный. Она КОРРЕКТНО завершает работу и КОРРЕКТНО выгружается из памяти.

Почти правильно сказал.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
lamamaДата: Среда, 08.04.2009, 10:05 | Сообщение # 5
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: Offline
Quote (eXceed)
Самая короткая программа в мире занимает всего два байта и эти байты такие: cd20

Я не претендовал на самую короткую программу biggrin . Я просто делился впечатлениями. Кстати, когда пытался упаковать свою программу hello.com архиватором - результат получился обратный - она увеличилась до 142 байт biggrin .


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
vitalyuДата: Среда, 08.04.2009, 11:42 | Сообщение # 6
Генерал-полковник
Группа: Гости
Сообщений: 852
Репутация: 108
Статус: Offline
Quote (lamama)
Вместе с Артуром Худяевым читаю сечас дисциплину "Язык программрования Ассемблер".

Советую посмотреть методичку и задания у Дмитрия Полуботко (сын В.А.). У него отличные лекции и практика были, жаль, что больше не преподает у нас. Если нужно - могу скинуть на мыло ..


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...
 
saginsaДата: Среда, 08.04.2009, 13:08 | Сообщение # 7
Генерал-полковник
Группа: Модераторы
Сообщений: 864
Репутация: 56
Статус: Offline
мне пожалуйста smile

"Я планировала, но не думала ..."
 
BoSSurmanДата: Среда, 08.04.2009, 14:34 | Сообщение # 8
Корифей
Группа: Модераторы
Сообщений: 674
Репутация: 65
Статус: Offline
Quote (eXceed)
Ответ не верный. Она КОРРЕКТНО завершает работу и КОРРЕКТНО выгружается из памяти.

ога smile


:-P
 
eXceedДата: Среда, 08.04.2009, 15:22 | Сообщение # 9
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
А вот не совсем корректный выход будет invoke TerminateProcess, 0

После этого будет множество мусора в памяти.

А вообще у Полуботко младшего очень хорошие лекции по асму и С. Надо быть полным идиотом, чтоб не понять их.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.

Сообщение отредактировал eXceed - Среда, 08.04.2009, 15:23
 
lamamaДата: Воскресенье, 12.04.2009, 23:28 | Сообщение # 10
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: 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
Репутация: 108
Статус: Offline
Quote (vitalyu)
Советую посмотреть методичку и задания у Дмитрия Полуботко (сын В.А.). У него отличные лекции и практика были, жаль, что больше не преподает у нас. Если нужно - могу скинуть на мыло ..

Ссылка на архив с доками (там даже часть задач решенные есть от maestRo) smile


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...


Сообщение отредактировал vitalyu - Понедельник, 13.04.2009, 01:18
 
vitalyuДата: Понедельник, 13.04.2009, 01:25 | Сообщение # 12
Генерал-полковник
Группа: Гости
Сообщений: 852
Репутация: 108
Статус: Offline
Quote (lamama)
При попытке написать подобный код под компилятор gcc получил "от ворот поворот"

в GCC есть специальный параметр -S .. Попробуйте, ради интереса, скомпилить простенький С код с этим параметром =) После загляните в файлик *.s smile

А вообще, в GCC есть такая вещь, как GAS (GNU Assembler Syntax), т.е. есть алиасы для вызова asm-функций ..

В Delphi своя фишка:
asm
end;


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...
 
lamamaДата: Понедельник, 13.04.2009, 14:17 | Сообщение # 13
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: Offline
Quote (vitalyu)
в GCC есть специальный параметр -S ..

Знаю. Такая фишка есть у всех компиляторов.
Quote (vitalyu)
А вообще, в GCC есть такая вещь, как GAS (GNU Assembler Syntax), т.е. есть алиасы для вызова asm-функций ..

На нем и написаны ассемблерные вставки, компилируемые gcc biggrin .


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
vitalyuДата: Среда, 15.04.2009, 01:21 | Сообщение # 14
Генерал-полковник
Группа: Гости
Сообщений: 852
Репутация: 108
Статус: Offline
Quote (lamama)
в результате чего был "рожден" следующий код

А этот следующий код что в gcc завелся??? wacko

Quote (lamama)
На нем и написаны ассемблерные вставки, компилируемые gcc

Дык, иначе бы он и не нужен был .. smile


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...


Сообщение отредактировал vitalyu - Среда, 15.04.2009, 01:23
 
lamamaДата: Пятница, 17.04.2009, 09:07 | Сообщение # 15
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: 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


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

close