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

Вниз

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

 
Горгер ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.046 c
15-1164826853
syte_ser78
2006-11-29 22:00
2006.12.24
Небольшой юбилей


2-1165447605
AlexeyT
2006-12-07 02:26
2006.12.24
Как отловить скроллинг/отрисовку TScrollBox?


1-1163063449
MegaVolt
2006-11-09 12:10
2006.12.24
Как правильно отлавить изменение Handle компонента?


2-1165468650
Antello
2006-12-07 08:17
2006.12.24
событие On Select компоненты TComboBox


15-1165265831
Kolan
2006-12-04 23:57
2006.12.24
Пишем программы по русски?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский