Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
14-71892
McLoop
2003-08-18 02:15
2003.09.22
Необходимые программы


6-71781
test
2003-07-23 18:20
2003.09.22
Как передать по средствам TCP TStringList c клиента на сервер?


1-71656
TroianOFF
2003-09-08 15:48
2003.09.22
Плавное появление формы


1-71674
BanderLog
2003-09-11 14:07
2003.09.22
Как в RichEdite обработать двойное нажатие мыши?


3-71516
Петр
2003-09-01 05:12
2003.09.22
Создание отчетов в RAVE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский