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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2016, 05:57   #1
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию Ассемблер на Delphi (консольный режим)

Здравствуйте!

Мне нужно заставить работать код на Delphi в консольном режиме.
Код:
//uses Crt;
const x=2;
      y=8;
      color=2*16+5;
      char=Ord('Z');
begin
   //ClrScr;
   asm
      mov ax, $b800
      mov es, ax // <<<--- здесь программа завершается
      mov al, 2
      mov ah, x
      mul ah
      mov bx, ax
      mov al, 160
      mov ah, y
      mul ah
      add bx, ax
      mov ax, 256
      mov cx, color
      mul cx
      mov dx, ax
      mov ax, char
      add dx, ax
      mov word ptr es:[bx], dx
   end;
   Readln;
end.
Это программа на ассемблере, отображающая на экране символ.

Она прекрасно работает на TurboPascal, но на Delphi никак не может запускаться. Доходит до строчки mov es, ax и закрывается консоль.

Не подскажите, почему так происходит? И что можно здесь исправить, чтобы работала?
Заранее спасибо!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.11.2016, 10:11   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Потому что код написан для реального режима, а делфи работает в защищенном режиме. Нельзя менять сегментные регистры и устройство памяти другое: нет доступа к видеобуферу. Делфи не мой профиль, готовый код не подкину. Есть пример на си:
Код:
void outchar(int x,int y,WCHAR c,WORD attr)
{
	DWORD w;
	COORD coord;
	coord.X=x;
	coord.Y=y;
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsoleOutputAttribute(hout,&attr,1,coord,&w);
	WriteConsoleOutputCharacter(hout,(LPWSTR)&c,1,coord,&w);
}
На ассемблере нужно просто сделать те же вызовы, с теми же параметрами.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 13.11.2016, 11:19   #3
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Ну да, работает в принципе так:
Код:
var H:HWND;
    w:dword;
    c:_coord;
    attr:word;
    ch:char;
begin
   c.X:=5;
   c.Y:=8;
   attr:=16;
   ch:='Z';
   H:=GetStdHandle(STD_OUTPUT_HANDLE);
   WriteConsoleOutputAttribute(H,@attr,1,c,w);
   WriteConsoleOutputCharacter(H,@ch,1,c,w);
   Readln;
end.
Жаль что не ассемблере...
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевсти с делфи в C# на консольный режим Ken_Watanabe Общие вопросы Delphi 1 23.10.2014 11:55
площадь и периметр треугольника за формулой Герона С++ (консольный режим) программирование Помощь студентам 4 23.01.2014 23:21
Построение дерева из постфиксного арифметического выражения. (Pascal[консольный режим Delphi]) [COOLER] Помощь студентам 0 26.02.2012 00:54
Delphi(консольный режим) спрятать окно Air Помощь студентам 4 02.07.2008 14:21
Загрузка из файла (консольный режим Делфи) adwaer Помощь студентам 3 30.06.2008 15:55