Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
[ASM&pas] to Chingachguk. 14.04.02 22:37 Число просмотров: 870
Автор: kar Статус: Незарегистрированный пользователь
|
см выше ..)
|
<programming>
|
[ASM&pas] компоновка DATA-сегментов. 13.04.02 01:06
Автор: kar Статус: Незарегистрированный пользователь
|
Здрям кого не видел..
..дык вот, ситуация такая:
Есть главная прога написанная на паскале и obj-файл напис. на асме.
Нужно скопоновать(склеить) DATA-сегменты.
...что я сделал:
объявил DATA segment c public'ом, все грамотно описал,подсоединил obj,
усе объвил...ан нет - говно...к DAT'е ничего не дописывается... :(
..Есть какие идеи?
|
|
[ASM&pas] компоновка DATA-сегментов. 13.04.02 03:46
Автор: Chingachguk <Chingachguk> Статус: Member
|
> ..Есть какие идеи?
Из книги Пирогова "ASSEMBLER: Учебный курс":
... Доступ к данным в программе на языке Турбо Паскаль можно получить через сегменты CONST или оканчивающиеся на _DATA(инициализированные переменные) или через сегменты с именами DATA, DSEG и оканчивающиеся на _BSS...
Пример:
DATA SEGMENT WORD 'DATA'
EXTRN S:NEAR
DATA ENDS
...
Var
S:STRING
...
S:='Pascal forewer ! )' ;
...
|
| |
[ASM&pas] поясняю.. 13.04.02 19:48
Автор: kar Статус: Незарегистрированный пользователь
|
> Из книги Пирогова "ASSEMBLER: Учебный курс": >...
Допустим есть есть два сегмента данных: сегмент (1) Pascal и сегмент (2) Obj.
Мне нужно их скомпоновать (склеить),так, чтобы не терялись данные сегмента (2) (..у меня теряются).
Из книги Рудакова и Федотова "Основы языка Pascal":
Программа на асме должна удовлетворять ряду требований.
Ее имя должно быть объявлено директивой public;сама подпрограмма должна размещаться в сегменте с именем CODE локальные переменные
должны быть размещены в сегменте с именем DATA ...
Ну это я и сделал... компоновка вроде без ошибок... но на дампе памяти сегмента данных информация почему-то из DATA оbj-файла не обнаруживается...
пи.эс. Пробобал различные имена (типа DSeg, _DATA..)...проблема та же Ж(
|
| | |
[ASM&pas] поясняю..Код дай глянуть ;) 15.04.02 00:23
Автор: Chingachguk <Chingachguk> Статус: Member
|
> Допустим есть есть два сегмента данных: сегмент (1) Pascal > и сегмент (2) Obj. > Мне нужно их скомпоновать (склеить),так, чтобы не терялись > данные сегмента (2) (..у меня теряются).
Пардон, не понял, что значит - "теряются" ? Ты не мог бы привести код свой, по возможности упрощенный, и пояснить, как и что там в данных пропадает ? ;)
> ...должны быть размещены в сегменте с именем DATA ... > > Ну это я и сделал... компоновка вроде без ошибок... но на > дампе памяти сегмента данных информация почему-то из DATA > оbj-файла не обнаруживается...
Эээ, а какая разница, что там в OBJ ? ;)
Мне вот фиолетово, как там происходит эта компоновка и что там как называется - главное, чтобы В РЕЗУЛЬТАТЕ было все верно !
Я правильно понимаю, что ты:
- Размещаешь в сегменте данных В АСМ-КОДЕ данные;
- Компонуешь их с пасом;
- Но не видишь их ... где ? В exe ? Или в OBJ ?
> пи.эс. Пробобал различные имена (типа DSeg, > _DATA..)...проблема та же Ж(
Так что давай свой код - я взгляну на него и разберемся ;)
Удачи !
|
| | | |
[ASM&pas] код.. 15.04.02 01:20
Автор: kar Статус: Незарегистрированный пользователь
|
..делаем так..
(1.)
В obj файле объявляю сегмент данных (сегмент кода неважен..)
DATA segment byte public ;почему именно "DATA" - так написанно
hz dw 0666h ;в книжке ..см выше..
DATA ends
CODE segment byte public
assume cs:CODE,ds:DATA
;код...
CODE ends
end
(2.)
затем создаю obj.. далее в pas-проге прописываю {$l name_obj},
компилю...(в пасе)
(3.)
Захожу в TD (turbo debuger) открываю exe (скопилированный на пасе :)
открываю dump (ориенитированный по ds и указывающий на 'общий' сегмент данных,то есть соединенный из obj-сегмента и сегмента данных пас программы)
...и что вижу:все данные ,что описаны были в пас-программе, есть - а что в obj сегменте - НЕТУ (нУ просто Их нет,то есть нет к примеру того самого "hz")
вот чЕ делать????
Ps А что насчет разных имен... то помимо имени 'DATA' пробовал и другие
(_DATA DSeg _BSS - проблема та же...данных из obj не находит)
|
| | | | |
[ASM&pas] код.. 16.04.02 22:44
Автор: Dude Статус: Незарегистрированный пользователь
|
Может, это и не к тому совсем, но я все-таки скажу:
я когда сливаю АСМ и С код и не указываю класс (типа 'DATA'), то у меня и не сливаются. В твоем коде я не видел объявления класса. Т.е., может быть, стоит попробовать
data segment public 'DATA'
(т.е., написать в конце 'DATA')
(ну, а я пишу "_data segment public 'DATA' ").
И еще: попробуй слить их tlink'ом (или чем-то вроде того), он в map-е указывает, что слил, а что нет, и можно увидеть разницу между твоим сегментом и родным паскальным.
|
| | | | |
[ASM&pas] согласен с Chingachgukom, но изголится можно :-) 16.04.02 19:10
Автор: Cyril <sc> Статус: Member
|
> ..делаем так.. > (1.) > В obj файле объявляю сегмент данных (сегмент кода > неважен..) > > DATA segment byte public ;почему именно "DATA" - так > написанно > hz dw 0666h ;в книжке ..см выше.. > DATA ends > > CODE segment byte public > assume cs:CODE,ds:DATA > ;код... > CODE ends > end > > (2.) > затем создаю obj.. далее в pas-проге прописываю {$l > name_obj}, > компилю...(в пасе) > > (3.) > Захожу в TD (turbo debuger) открываю exe (скопилированный > на пасе :) > открываю dump (ориенитированный по ds и указывающий на > 'общий' сегмент данных,то есть соединенный из obj-сегмента > и сегмента данных пас программы) > ...и что вижу:все данные ,что описаны были в пас-программе, > есть - а что в obj сегменте - НЕТУ (нУ просто Их нет,то > есть нет к примеру того самого "hz") > > вот чЕ делать???? > > Ps А что насчет разных имен... то помимо имени 'DATA' > пробовал и другие > (_DATA DSeg _BSS - проблема та же...данных из obj не > находит)
// данные поместить в сегмент code, иначе пас начнет ругаться
.286
public S
CODE segment byte public
S db 4,'TEST','$'
CODE ends
END
// в Паскале вызываем это так
program Test;
{$L test.obj}
var
ps : ^string;
procedure S; external;
begin
ps := Addr(S);
writeln(ps^);
end.
В принципе, это то же самое что вызвать ф-ю асма возвращающую указатель на данные
P. S. Ну и нафига тебе такой гемор
|
| | | | |
НЕ выйдет ... (я так думаю) 15.04.02 04:22
Автор: Chingachguk <Chingachguk> Статус: Member
|
Ответ: НИКАК.
Я попробовал разместить в сегменте CONST строку: S db 4,'TEST':
.286
CONST SEGMENT BYTE PUBLIC
S db 4,'TEST','$'
CONST ENDS
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
PUBLIC MY_PROC
MY_PROC PROC NEAR
PUSH BP
MOV BP,SP
pusha
mov dx,offset S+1
mov ah,09h
int 21h
xor ax,ax
int 16h
popa
POP BP
RET
MY_PROC ENDP
CODE ENDS
END
Она видна в exe, и код ее выведет(в смысле, если позвать MY_PROC). Тут все в порядке. Однако если написать:
WriteLN(S); - компиллер ругнется на это.
Если определить в блоке CONST ее:
const
S: string[5]='?';
То все зашибись. НО ЭТО ДРУГАЯ СТРОКА !
Почему так ? Думаю, пас вообще не может это собрать(в смысле на момент обработки WriteLN(s);) ОН НЕ ЗНАЕТ НИЧЕГО про то, что в obj описана такая константа ... Он пытается перевести pas в асм, потом собрать obj и только потом линкует. Да, линковщик знает о всех именах и может собрать такое. Но пас-то ничего не знает в момент обработки кода на пасе ...
Ты можешь спросить: А как же он подключает процедуру ? Например, MY_PROC ? Ответ: ты ее описал (как external), ты просто дал ему ПРОТОТИПЫ ее - вот он и может сделать свой асм-прекод. А вот данные описать аналогично - фиг, нельзя ...
Хотя, может, я и ошибаюсь, но не думаю, что сильно ...
Можешь делать так: вызывать процедурки типа "дай-ка мне адрес" -> потом с ним работать(например, как с указателем)...
|
| | |
[ASM&pas] to Chingachguk. 14.04.02 22:37
Автор: kar Статус: Незарегистрированный пользователь
|
см выше ..)
|
|
[ASM&pas] компоновка DATA-сегментов. 13.04.02 02:18
Автор: CETb2 Статус: Незарегистрированный пользователь
|
В седьмом Паскале можно писать в код программы - код ассемблера .
Вместо begin пишешь ASM.
Procedure (nnnnnnnnnnn);
const
a='123';
asm
end;
Может это выход ?
|
|
|