Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

BP 7.0 + inline Assembler. MOV DX,OFFSET TEXT - ГЛЮЧИТ   Найти похожие ветки 

 
Zilog ©   (2003-09-09 16:46) [0]

Пишу всё это в Borland Turbo Pascal 7.0

примерно такая процедура, прямой записи символов в видеопамять в текстовом режиме.
Глюк следующий: я так понял, неправильно грузиться адрес переменной ТЕХТ, в связи с чем на экран выводиться мусор.
Дык по другому не выходит - пробовал через указатели -- ничего не вышло (может не так делал?!).

Есь кто знает в чём дело - киньте плиз!

procedure (Text : string);
begin

asm
mov dx,0b800h
mov es,dx
mov di,0
MOV BX,OFFSET TEXT << ГЛЮЧИТ ТУТ
mov cx,(length of s)
@@10: mov al,[bx]
or al,al
jz exit
mov [es:di],al
...
и т.д.

end;
end;


 
Anatoly Podgoretsky ©   (2003-09-09 16:52) [1]

Что значит глючит?


 
Zilog ©   (2003-09-09 16:56) [2]

Задача такая - загрузить в ВХ адрес адрес переменной TEXT типа String.
насколько я понял, он неправильно грузится - т.к. на экран выводиться мусор.
в дельфях я нчно подобное делал, но грузил указатель - у меня всё работало - тут же нет...


 
Verg ©   (2003-09-09 17:03) [3]


> OFFSET TEXT


Извиняй, Text - это переменная в стеке (смещение по BP). В этом случае offset - это бред.
Мало того, что
lea bx, Text
Так еще и адресоваться надо от сегмента стека и длину брать
из

Mov Cx, byte ptr ss:[bx]


 
PVOzerski ©   (2003-09-09 17:05) [4]

Ты с BX-то поосторожнее, без необходимости его не используй. К сожалению, детали не помню, но где-то его RTL очень любит использовать. Кстати, и у Delphi тоже. Неспроста же при register-передаче параметров EBX деликатно не трогается...


 
Anatoly Podgoretsky ©   (2003-09-09 17:07) [5]

lea bx, Text
Навеоно пойдет и
mov bx, Text
А вот offset это дурость, ты получаешь смещение до адреса адреса переменной.


 
Verg ©   (2003-09-09 17:07) [6]


> PVOzerski © (09.09.03 17:05) [4]


Для BP (Borland PAscal) насчет Bx -а тут все пучком.
Оптимизатор отсутствует напроч... :)


 
Zilog ©   (2003-09-09 17:10) [7]

Мало того, что
lea bx, Text


исправил, а СХ задал вручную, пока для проверки - не работает...


 
Anatoly Podgoretsky ©   (2003-09-09 17:10) [8]

PVOzerski © (09.09.03 17:05) [4]
Там нет проблем, вроде все регистры свободны,


 
Zilog ©   (2003-09-09 17:11) [9]

mov bx,text - непроходит :(


 
Anatoly Podgoretsky ©   (2003-09-09 17:16) [10]

А второй вариант ты проверил, с lea, а отладчиком посмотреть, что получаеш и что загоняешь в регистр.
Проявляй активность.


 
Verg ©   (2003-09-09 17:23) [11]

А что не работает-то?

Знаешь как string-и то устроены в Борланд Паскале?

Первый байт - длина строки, далее сама строка - и никаких нулей!!


 
Anatoly Podgoretsky ©   (2003-09-09 17:25) [12]

Кусок кода откуда то бездумно срисован.


 
PVOzerski ©   (2003-09-09 17:29) [13]

Может, проще через Mem[] работать?


 
Verg ©   (2003-09-09 17:31) [14]


> Может, проще через Mem[] работать?


И так.
Уж куда проще-то?! :)


 
VMcL ©   (2003-09-09 17:33) [15]

>Zilog © (09.09.03 16:46)

Под рукой BP нету, но вроде как-то так:

procedure (Text : string);
begin

asm
mov dx,0b800h
mov es,dx
mov di,0
MOV BX, [Text]
xor cx, cx
mov cl, [bx]
...
end;


 
Verg ©   (2003-09-09 17:34) [16]

Вот только все это расточительство халатное - передавать строки по значению. По 256 байтов на каждую строку это жрет безбожно.
Передача идет адресом строки, но в самом начале прцедуры компилятор вставляет код, который копирует строку в заранее отведенное место в стеке процедуры, при этом он резервирует в стеке те самые 256 байт....


 
Verg ©   (2003-09-09 17:37) [17]


> VMcL © (09.09.03 17:33) [15]


Не, так вообще нельзя...


 
Verg ©   (2003-09-09 17:39) [18]


> Mov Cx, byte ptr ss:[bx]


Тьфу ты, зарапортовался :)

Конечно же
xor cx,cx
Mov Cl,ss:[bx]


 
Anatoly Podgoretsky ©   (2003-09-09 17:40) [19]

Дело в том, что дальше в коде тоже муть, почему ту предполагается, что это AnsiString


 
Verg ©   (2003-09-09 17:48) [20]

Дык это....

FastWrite(St : string; Row, Col, Attr : Byte);

или Турбо Профессионал все забыли что ли.....


 
PVOzerski ©   (2003-09-09 17:50) [21]

Может, оно и не оптимизировано, но
const
s:string="H"#70"e"#70"l"#70"l"#70"o"#70"!"#70;
begin
move(s[1],mem[$b800:0],byte(s[0]));
readln;
end.


 
Zilog ©   (2003-09-09 17:52) [22]

Короче немного процедуру подправил - на входе получается pointer на string, который собственно надо вывести. Но lea bx,p не спасает... указывает на мусор.


 
Verg ©   (2003-09-09 17:58) [23]


> не спасает... указывает на мусор.


Ты гонишь.
Чес-слово.

Ты уж правь что-нить одно:

либо способ передачи строки, либо MovOffset на lea
Если ты поправишь способ передачи, то код получения адреса строки будет другим...


 
VMcL ©   (2003-09-09 18:18) [24]

procedure (Text : string); assembler;
asm
push ds
mov dx, 0b800h
mov es, dx
xor di, di
lds si, Text
xor cx, cx
mov cl, [si] -- теперь в CX длина строки
...
pop ds
end;


 
VMcL ©   (2003-09-09 18:23) [25]

Неаккуратненько :)

procedure (Text : string); assembler;
asm
push ds
mov dx, 0B800h
mov es, dx
xor di, di
lds si, Text
xor cx, cx
mov cl, [si]
{ теперь в CX длина строки }
{ DS:SI - указатель на строку}
...
pop ds
end;


 
Verg ©   (2003-09-09 18:27) [26]


> VMcL © (09.09.03 18:18) [24]


Да где ж вы такую траву-то берете ?! :))


> procedure (Text : string); assembler;
> asm
> push ds
> mov dx, 0b800h
> mov es, dx
> xor di, di
> lds si, Text

^^^^^^^^^^^^^^
это просто не скомпилится!

Еще раз говорю.
Если Text - параметр по значению, то надо:
lea bx, Text
обращаться надо с заменой сегмента на ss:
mov cl, ss:[bx]

Если Text - параметр по ссылке (var text:string), то надо:
les bx, Text
обращаться надо с заменой сегмента на es:
mov cl, es:[bx]

> xor cx, cx
> mov cl, [si] -- теперь в CX длина строки
> ...
> pop ds
> end;


 
Verg ©   (2003-09-09 19:31) [27]

const ScreenWidth : integer = 80;
VideoSegment : word = $B800;

procedure DrawString(const text : string; x, y, attr : integer);
begin
asm
mov es, VideoSegment

mov ax,y
mul ScreenWidth
mov di,ax
add di, x
shl di,1
xor cx,cx

push ds
Lds si, Text

cld
lodsb
mov cl,al
mov Ah, byte ptr attr
@@1:
lodsb
stosw
loop @@1
pop ds
end;
end;


 
VMcL ©   (2003-09-09 19:45) [28]

>Verg © (09.09.03 18:27) [26]

Согласен. Давно это было 16-тибитный asm :)



Страницы: 1 вся ветка

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
1-71705
XAMLO
2003-09-11 00:59
2003.09.22
Как вывести строку в консоль?


14-71950
napil
2003-08-26 22:08
2003.09.22
домин


14-71958
Chip
2003-09-02 14:11
2003.09.22
Delphi5 updates?


3-71464
ksu_sergo
2003-09-02 12:05
2003.09.22
union и select


1-71755
ruslan_as
2003-09-10 10:18
2003.09.22
Как вложить файл PDF в мой EXE