Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Pinkolik
0 / 0 / 0
Регистрация: 30.05.2015
Сообщений: 14

Прерывание в ассемблерной вставке выдаёт ошибку

11.12.2015, 19:32. Показов 2541. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, начал изучать ассемблерный вставки в Free Pascal, хочу с помощью стандартного DOS'овского прерывания вывести строку s, при компиляции ошибок нету, но при запуске выдаёт ошибку 216. Описание прерывания брал отсюда http://www.codenet.ru/progr/dos/dos_0017.php . Вот сам код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
program outs;
 
{$asmmode intel}
var
s: string;
 
begin
s:='Test$';
asm
mov ah, 09h
mov ds, [s]
mov dx, 0h
int 21h
end;
readln();
end.
Я рассуждал так, в регистр ds мы помещаем адрес на строку s, а в регистр dx его смещение, но так как мы хотим выводить с первого байта строки, то смещение равно нулю, но программа почему-то отказывается работать. Спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2015, 19:32
Ответы с готовыми решениями:

Работа с указателями в ассемблерной вставке
Вопрос простой. Строка в паскале - массив байт. Для обработки этого массива пытаюсь получить ссылку на адрес в памяти ...

Выдает ошибку при вставке данных в БД
Здравствуйте скажите почему когда я вставляю данные в БД то у меня постоянно срабатывает вот это условие if (rs == null) { ...

Microsoft Visual Studio выдает ошибку при вставке новой библиотеки
Простейшая программа: #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "iostream" #include...

4
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,434
11.12.2015, 22:07
Изначально: (С) Mixxx

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
program outs;
 
{$asmmode intel}
 
var
  s:String;
 
procedure WriteS(s:String);assembler;
asm
  push ds {сохраняем сегмент данных}
  mov ah,40h {номер функции прерывания}
  mov bx,1{стандартный вывод это 1}
  lds dx,[s] {адрес строки в ds:dx}
  mov si,dx {адрес строки в ds:si для lodsb}
  lodsb {длину строки в al (первый байт в строке это ее длина!)}
  inc dx{чтобы не напечатать первый байт}
  xor cx,cx;
  mov cl,al{чтобы в сх была длина строки}
  int 21h {DOS}
  pop ds {восстанавливаем ds}
end;
 
begin
  s:='Test$';
  writeS(s);
  readln;
end.
Добавлено через 1 час 13 минут
Pinkolik, прошу прощения, только сейчас сообразил, что раздел fp, программа написана для tp.
1
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
13.12.2015, 12:20
Лучший ответ Сообщение было отмечено Pinkolik как решение

Решение

1. FreePas - это 32-разрядный защищенный режим.
2. Отсюда следует: сегментные регистры не надо трогать, если еще не знакомы с селекторами.
Остальное просто:
Assembler
1
2
3
mov ah, 09h
mov edx,offset s 
int 21h
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8658 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
14.12.2015, 00:18
Одумайтесь, если компилятор FPC x32 for DOS, то там DPMI, и все прерывания вызываются через сервис DPMI (это помимо необходимости выделения памяти в 1-ом мегабайте). Чаще для этого используют процедуры-обёртки intr и msdos.
Пример изменения шрифта через функцию BIOS
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Uses
  DOS, Go32;
Var
  Font         : Array[1..4096] Of Byte;
  FontFile     : File;
  CPURegisters : Registers;
  SegSel       : LongInt;
Begin
 Assign(FontFile,'FONT.FNT');
 ReSet(FontFile,1);
 BlockRead(FontFile,Font,4096);
 Close(FontFile);
 
 {выделяем память в первом мегабайте}
 SegSel:=Global_DOS_Alloc(SizeOf(Font));
 if int31error<>0
 then begin
   WriteLn('Error while allocation real mode memory, halting...');
   Halt(1);
 end;
 {копируем в неё содержимео переменной Font}
 DosMemPut(Word(SegSel shr 16), 0, Font, SizeOf(Font));
 
 {вызываем прерывания}
 CPURegisters.AX:=$0003;
 Intr($10,CPURegisters);
 CPURegisters.AX:=$1110;
 CPURegisters.BH:=$10;
 CPURegisters.BL:=$0;
 CPURegisters.CX:=$100;
 CPURegisters.DX:=$0;
 CPURegisters.ES:=Word(SegSel shr 16);    //Seg(Font);
 CPURegisters.BP:=0;                      //Ofs(Font);
 Intr($10,CPURegisters);
 CPURegisters.AH:=$1;
 CPURegisters.CX:=$0E0F;
 Intr($10,CPURegisters);
 
 {освобождаем память из первого мегабайта}
 Global_DOS_Free(Word(SegSel));
end.
Это я к тому, что если что-то делать на BASM, то ограничиться манипуляциями с переменными, не трогая разные API (BIOS, DOS, Windows). Вдобавок, есть смысл разобраться с директивами компилятора для соглашений о передаче параметров в подпрограмму (их несколько).
2
 Аватар для Pinkolik
0 / 0 / 0
Регистрация: 30.05.2015
Сообщений: 14
14.12.2015, 22:06  [ТС]
Спасибо всем большое, ошибку свою понял, узнал много нового, буду изучать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2015, 22:06
Помогаю со студенческими работами здесь

Jump в ассемблерной вставке
Использую хак во внешнее приложение. static const DWORD func_hack_Ret = 0x45C5D9; // адрес возврата в исходное приложение static...

Ошибки в ассемблерной вставке
в 24 и 25 строке ругается, что недопустимое число операторов #include &quot;iostream&quot; #include &quot;windows.h&quot; #include...

Прерывания в ассемблерной вставке
Здравствуйте. В программу, написанную на С++, нужно добавить ассемблерную вставку, поддерживающую прерывания (int 21h например). Каким...

Непонятки в ассемблерной вставке
В общем, все работает, только х2 не принимает значения с минусом, просто игнорирует минус + не работает команда перехода jg, работает...

Метки в макросах в ассемблерной вставке
В C++ написан макрос с ассемблерной вставкой, который содержит в себе метку &quot;doit&quot; и команду перехода на неё: #define MYMACRO(x, y,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru