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

Вниз

Получить адрес в ассемблерной вставке   Найти похожие ветки 

 
Горгер ©   (2006-12-03 20:57) [0]

В Паскале.
Есть переменная s типа string
Нужно получить в ассемблерной вставке её сегмент и смещение.
Кто знает как?
Примечание mov es, seg s
                mov bp, offset s не работает


 
oxffff ©   (2006-12-03 22:21) [1]

var s:string;

asm
mov eax,s;
end;

А причем здесь сегмент. Если модель FLAT.
Тогда это не сегмент, а селектор.


 
oxffff ©   (2006-12-03 22:22) [2]

Сегмент тебе не нужен.


 
palva ©   (2006-12-03 23:24) [3]

> oxffff ©   (03.12.06 22:22) [2]
У него, наверно, 16-разрядный Borland Pascal ver 7 Там в адресе типа far используется сегмент и смещение. В первых двух байтах длинного адреса идет сегмент, в следующих двух - смещение.


 
Горгер ©   (2006-12-04 02:51) [4]


oxffff
palva
Да, это BP 7.
Что же делать?


 
Джо ©   (2006-12-04 03:01) [5]

> [4] Горгер ©   (04.12.06 02:51)
>
> oxffff
> palva
> Да, это BP 7.
> Что же делать?

Так а что сделать-то нужно? Конечно, move es, seg s не работает, в es так не записывают. Если непременно нужно его в ес записать, то делай так:
 mov ax, seg s
 push ax
 pop es

Остается непонятным, правда, зачем это нужно. Ибо и так заранее известно, в каком сегменте эта твоя переменная.


 
Горгер ©   (2006-12-04 03:29) [6]

Спасибо за подсказку. А нужно это для прерывания INT 10h (отрисовка строки на странице видеопамяти).


 
atruhin ©   (2006-12-04 03:51) [7]

> А нужно это для прерывания INT 10h (отрисовка строки на
> странице видеопамяти).

В TP7 есть процедура вызывающая прерывание, по моему так и называется int!
Если будешь писать обработчик прерывания на pascal, учти там есть глюки компилятора.
Например при работе с числами longint, не сохраняет старшую часть регистра,
было что то еще, не помню.


 
Джо ©   (2006-12-04 04:29) [8]

> [6] Горгер ©   (04.12.06 03:29)
> А нужно это...

Нет, ты не понял. Я имею в виду, что непонятно, зачем выяснять сегмент "переменной s: string" и запихивать это значение в ES? Если переменная глобальная, ее смещение, собственно, и так уже имеется в ES, если же локальная — то она вообще ни в каком сегменте не находится, а располагается на стеке.


 
Чапаев ©   (2006-12-04 08:59) [9]

> push ax
> pop es
А зачем? Можно же mov es,ax


> учти там есть глюки компилятора.
Как всегда, виноват компилятор...


> при работе с числами longint, не сохраняет старшую часть
> регистра
Какое отношение лонгинт к 16-разрядным регистрам имеет? Что Паскаль -- 16-разрядный компилятор, поминим, надеюсь?


> если же локальная — то она вообще ни в каком сегменте не
> находится, а располагается на стеке.
Сегмент стэка -- чем не сегмент? ;-) Для его целей и надо push es, pop ss. (Это, конечно, в режиме телепатии предположение)


 
palva ©   (2006-12-04 10:32) [10]


> Горгер ©   (04.12.06 02:51) [4]
>
> Что же делать?

Если s находится в стеке (локальна), то наверно так
push ss
pop es
lea bp, s+1

Если s глобальна, то
push ds
...

Могу ошибаться.


 
Чапаев ©   (2006-12-04 10:50) [11]

> push ss
> pop es
Точно, в предыдущем ответе я протупил.


> lea bp, s+1
В стэке все переменные выравнены по границе слова.


 
palva ©   (2006-12-04 11:13) [12]


> В стэке все переменные выравнены по границе слова.

Я хотел, чтобы был указатель на данные. Ведь это короткая строка. С другой стороны я не знаю требования int 10 Возможно, там впереди должен идти байт с длиной. Тогда конечно s а не s+1 Но это автор, думаю, разберется.


 
Чапаев ©   (2006-12-04 11:15) [13]

> [12] palva ©   (04.12.06 11:13)
Брррр. Ты сперва почитай какой-нибудь справочник по прерываниям. Потому что пока это всё "пойди туда, не знаю куда". Из бумажных рекомендую Джордейна и Нортона. Из электронных неплохи были Norton Guide и TechHelp.


 
oxffff ©   (2006-12-04 11:15) [14]

Если есть переменная a:string;

То адрес переменной a, это  Lea bp,[a]


 
Чапаев ©   (2006-12-04 11:17) [15]

> [12] palva ©   (04.12.06 11:13)
А, автор не ты. Пардон. :-)


 
oxffff ©   (2006-12-04 11:32) [16]

>Чапаев ©   (04.12.06 10:50) [11]
> push ss
> pop es
>Точно, в предыдущем ответе я протупил.
> lea bp, s+1
>В стэке все переменные выравнены по границе слова.

И что дальше?

Ты утверждаешь, что такая конструкция

mov ax,[bp]

конструкция вызовет исключение процессора.

Или что ты хотел этим сказать.


 
oxffff ©   (2006-12-04 11:45) [17]

To Чапаев ©

procedure TmainForm.Button1Click(Sender: TObject);
var a:integer;
begin
a:=4;
asm
lea eax,[a+1];
mov eax,[eax]; // здесь исключение не возникает
end;
showmessage(inttostr(d));
end;

An #AC exception occurs when an unaligned-memory data
reference is performed while alignment checking is enabled.
After a processor reset, #AC exceptions are disabled. Software
enables the #AC exception by setting the following register bits:
�� CR0.AM=1.
�� RFLAGS.AC=1.
When the above register bits are set, an #AC can occur only
when CPL=3. #AC never occurs when CPL < 3.



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

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

Наверх




Память: 0.51 MB
Время: 0.033 c
1-1163069924
Choco
2006-11-09 13:58
2006.12.24
Убрать заголовок формы


15-1164727925
SysError
2006-11-28 18:32
2006.12.24
архив форума


15-1164742286
Красная майка
2006-11-28 22:31
2006.12.24
ММР $0x111ED6


2-1164922852
azl
2006-12-01 00:40
2006.12.24
Как удалить в тексте из 3-х строк первые 2 строки?


1-1163090864
DelphiLexx
2006-11-09 19:47
2006.12.24
DBGridEh закрасить ЦЕЛИКОМ строку