Форум: "Прочее";
Текущий архив: 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.043 c