type
Registers = record case integer of
0 : (AX, BX, CX, BP, SI, DI, DS, ES, Flags : word);
1 : (AL, AH, BL, BH, CL, CH, DL, DH : byte)
end ;
прерывания BIOS и DOS а Паскале
Значит для этого я нашел что необходимо определить переменную типа
Код:
а сами прерывание вызываються с помощью функций
Код:
var r : registers;
Intr ($12, r);
r.АН := $30;
MsDos(r);
Intr ($12, r);
r.АН := $30;
MsDos(r);
Вывод строки на ассемблере с использованием прерывания
Код:
mov ah,09h
lea dx,str1 //строка дял вывода
int 21h
lea dx,str1 //строка дял вывода
int 21h
есть и другие мб лучше каким другим?
т е реализация на Паскале должна быть примерно такая(не работает поджскажите плиз как правильно или свой вариант).
Код:
var str:string[50];
str := 'qwert';
r.АН := $09;
//r.dx := незнаю как сюда занести значение str поэтому исп следующее
asm
lea dx,str
end;
MsDos(r);
str := 'qwert';
r.АН := $09;
//r.dx := незнаю как сюда занести значение str поэтому исп следующее
asm
lea dx,str
end;
MsDos(r);
строку то оно выводит но непонятно какую)
Хелп плиз
Код:
Program ss;
uses crt, dos;
var str:string[1]; r:registers;x:integer;
begin
Clrscr;
x:=5;
r.ah := $09; //вывод строки
r.bh := $00; //нулевая страница
r.al := x+$30; //символ
r.bl := 75; //цвет экрана и символа
r.cx := 2; //количество повтор символа
intr($10, r); //вызов биос прерывания
{MsDos(r);}
end.
uses crt, dos;
var str:string[1]; r:registers;x:integer;
begin
Clrscr;
x:=5;
r.ah := $09; //вывод строки
r.bh := $00; //нулевая страница
r.al := x+$30; //символ
r.bl := 75; //цвет экрана и символа
r.cx := 2; //количество повтор символа
intr($10, r); //вызов биос прерывания
{MsDos(r);}
end.
Для вывода одного символа:
Код:
it:=ord('A');
asm
xor ah,ah
mov al,03h
int 10h
mov ah,09h
mov al,it
xor bh,bh
mov bl,80h
mov cx,50d
int 10h
end;
asm
xor ah,ah
mov al,03h
int 10h
mov ah,09h
mov al,it
xor bh,bh
mov bl,80h
mov cx,50d
int 10h
end;
Цитата:
Вывод строки на ассемблере с использованием прерывания
Код:
mov ah,09h
lea dx,str1 //строка дял вывода
int 21h
lea dx,str1 //строка дял вывода
int 21h
Это не правильно как и то что написано ниже. Сегмент строки должен быть в DS.
Пример вывода строки:
Код:
var
str:string[50];
p:pointer;
begin
str:='HELLLLOOO $';
p:=@str[0];
asm
xor ah,ah
mov al,03h
int 10h
mov ah,09h
lds dx,p
int 21h
end;
str:string[50];
p:pointer;
begin
str:='HELLLLOOO $';
p:=@str[0];
asm
xor ah,ah
mov al,03h
int 10h
mov ah,09h
lds dx,p
int 21h
end;
а насчет того кода:
Код:
Функция DOS 09h — Записать строку в STDOUT с проверкой на Ctrl-Break
Ввод:
АН = 09h
DS:DX = адрес строки, заканчивающейся символом $ (24h)
Вывод:
Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа)
Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка
Ввод:
АН = 09h
DS:DX = адрес строки, заканчивающейся символом $ (24h)
Вывод:
Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа)
Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка
т е тот код будет работать можешь проверить или я сам могу программку кинуть если что... а так мне надо вот так как я описывал через переменную регистра и тех функцый)
т е получаетсья как в r.dx занести адрес строки str?
Код:
r.ah:=0;
r.al:=$3;
intr($10,r);
r.ah:=$09;
r.ds:=seg(it);
r.dx:=ofs(it)+1; {[0] - длинна строки}
intr($21,r);
r.al:=$3;
intr($10,r);
r.ah:=$09;
r.ds:=seg(it);
r.dx:=ofs(it)+1; {[0] - длинна строки}
intr($21,r);
А на счет "DOS 09h" ты сам и написал, что сегмент должен быть в DS. :):)
LEA загружает только смещение.