Форум: "Основная";
Текущий архив: 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.012 c