информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаПортрет посетителяSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[ASM&pas] to Chingachguk. 14.04.02 22:37  Число просмотров: 954
Автор: 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;

Может это выход ?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach