информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителяСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Logitech готовится закрыть очередную... 
 Серьёзная атака на инфраструктуру... 
 Microsoft призналась в сознательном... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вообще-то... 11.10.03 16:37  Число просмотров: 942
Автор: :-) <:-)> Статус: Elderman
Отредактировано 11.10.03 16:38  Количество правок: 1
<"чистая" ссылка>
> Там в тексте указано буквально следующее:
[...поскипано]
Все так... Просто мы с автором корневого поста вчера оперативно решили этот вопрос по Аське - ошибка была именно в этом.
http://www.bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=89987

> > Вот и генерился код для разыменования этого указателя:
> > mov bx,[_buff512_r]
> > mov al,[bx]
> Хотя даже если бы это был указатель. Индексирование
> указателя совершенно аналогично индексированию массива.

Да, с точки зрения языка С индексирование указателя совершенно аналогично индексированию массива. Но я говорю о том, что в обоих случаях генерится совершенно различный код. Мне всегда не нравилось в языке С то, что взглянув на конструкцию вида char c = *buff512_r; и не зная, как объявлен buff512_r (как массив или указатель), нельзя точно сказать, что происходит в терминах Ассемблера. Потому что возможны варианты:
1) если buff512_r - массив типа char, то генерится ОДНО обращение к памяти:
mov al,byte ptr [buff512_r] ; берем один байт по смещению [buff512_r]

2) если buff512_r - указатель, то генерятся ДВА обращения к памяти:
mov bx,[buff512_r] ; берем значение указателя по смещению [buff512_r]
mov al,[bx] ; берем 1 байт по этому указателю
<programming>
[C++] borland C++ 3.1.Оператор присвоения не работает??? 10.10.03 18:51  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Итак, проблема такая:
в Си коде обнаружил следующую строчку:

char* chain_ptr=(char*)table[buff512_r[0]];


Что есть что:
buff512_r- массив из unsigned char. // extern unsigned char buff512_r[512]

table - массив указателей на строки(ASCIIZ) НО по необходимости имеет тип unsigned long. //unsigned long table[256];

chain_ptr - указатель на отдельный символ отдельной строки.

Итак,после долгих моих извращений стало достоверно ясно, что (char*)table[buff512_r[0]] указывает на DS:1E60h ,А!!! chain_ptr мать его так - на DS:2160h!!! *ЛЯ, И ЭТО ПОСЛЕ БАНАЛЬНОГО ПРИСВОЕНИЯ! когда я это увидел - так чуть НЕ абуел (пред глазами пронеслась вся жизнь и вместе с ней все лекции по с/с++). При дизассемблировании стал понят исходный код:
--------
mov bx,[_buff512_r]
mov al,[bx]
mov ah,00
mov cl,2
shl ax,cl
mov bx,ax
mov si,[bx+0984]
---------
что есть что:
si - это младшая часть (1ое слово) указателя chain_ptr ,то есть содержащее им смещение.

код:
mov cl,2
shl ax,cl
как всем известно - умножение ax на 4.

0984 это смещение table.

MOV AL,[BX] - ХРЕН ЗНАЕТ ЧТО ЭТО ТАКОЕ

ИТАК, как все должно было выглядеть:
сначала должен браться индекс (buff512_r[0])
- mov bx,[_buff512_r] -

Затем его умножить на 4, так как unsigned long есть 4 байта.
Потом добавить к получ. рез-ту смещение таблицы..
И получим искомое значение эл-та table[buff512_r[0]](если прочесть word получим соответственно первое слово данного эл-та.. это и будет первым словом в указателе chain_ptr)

Почти Все так и есть.. но не понятна строчка MOV AL,[BX] которая все нафиг портит, потому что этих сра*ых скобок не должно быть вовсе!

Кто что может сказать по этому поводу?
ps DOS программа. компилятор - сабж.
[C++] Узнаю борландовские поделки :-) 11.10.03 00:56  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Я уже писал когда-то, что 6-й билдер упорно заходил внутрь условия

if (false) {
break;
}

Причем я даже не понял что на это влияло. Добавление одной переменной внутрь этого условия:

if (false) {
int a=1;
break;
}

спасло ситуацию. А сама переменная потом соптимизировалась.

Так что рекомендую поиграться с контекстом. Например сначала сделать

char **temp = table;

а потом уже брать индекс в temp-е.
Синтаксически все верно. Нечего голову себе морочить - пытайся обойти глюки компилятора (уж не думаешь ли ты что компилятор это такая прога, в которой нет глюков :-)) )
[C++] В защиту Борланда 11.10.03 12:08  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
Но в данном случае виноват не компилятор... buff512_r был объявлен не как массив, а как указатель:
extern unsigned char *buff512_r;
а нужно было так:
extern unsigned char buff512_r[];

Вот и генерился код для разыменования этого указателя:
mov bx,[_buff512_r]
mov al,[bx]
[C++] Вообще-то... 11.10.03 15:19  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Но в данном случае виноват не компилятор... buff512_r был
> объявлен не как массив, а как указатель:
> extern unsigned char *buff512_r;
> а нужно было так:
> extern unsigned char buff512_r[];
Там в тексте указано буквально следующее:
buff512_r- массив из unsigned char. // extern unsigned char buff512_r[512]

table - массив указателей на строки(ASCIIZ) НО по необходимости имеет тип unsigned long. //unsigned long table[256];

То бишь оба массива объявлены как действительно массивы. А операция приведения типа вообще одна из самых низкоприоритетных (по крайней мере значительно ниже операции индексировани), так что сначала должен взяться индекс, а потом у взятого значения приводиться тип.

> Вот и генерился код для разыменования этого указателя:
> mov bx,[_buff512_r]
> mov al,[bx]
Хотя даже если бы это был указатель. Индексирование указателя совершенно аналогично индексированию массива. Кроме того, при передаче массива в функцию (даже если указаны константные размерности), он всегда передается как указатель. И тем не менее продолжает работать.

Может в данном случае нам и не сказали всю правду и компилятор действительно не виноват (хотя я сомневаюсь). Но я борландом уже зарекся пользоваться: у меня и моих знакомых было довольно много глюков, которые они вылавливали вылавливали, пока не поняли, что глючит не прога, а компилер. Я ничего не имею против борланда, хотя бы потому, что их продукты стоят $60, а MSVC - $1500. Но писать все равно не хочу.
[C++] Вообще-то... 11.10.03 16:37  
Автор: :-) <:-)> Статус: Elderman
Отредактировано 11.10.03 16:38  Количество правок: 1
<"чистая" ссылка>
> Там в тексте указано буквально следующее:
[...поскипано]
Все так... Просто мы с автором корневого поста вчера оперативно решили этот вопрос по Аське - ошибка была именно в этом.
http://www.bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=89987

> > Вот и генерился код для разыменования этого указателя:
> > mov bx,[_buff512_r]
> > mov al,[bx]
> Хотя даже если бы это был указатель. Индексирование
> указателя совершенно аналогично индексированию массива.

Да, с точки зрения языка С индексирование указателя совершенно аналогично индексированию массива. Но я говорю о том, что в обоих случаях генерится совершенно различный код. Мне всегда не нравилось в языке С то, что взглянув на конструкцию вида char c = *buff512_r; и не зная, как объявлен buff512_r (как массив или указатель), нельзя точно сказать, что происходит в терминах Ассемблера. Потому что возможны варианты:
1) если buff512_r - массив типа char, то генерится ОДНО обращение к памяти:
mov al,byte ptr [buff512_r] ; берем один байт по смещению [buff512_r]

2) если buff512_r - указатель, то генерятся ДВА обращения к памяти:
mov bx,[buff512_r] ; берем значение указателя по смещению [buff512_r]
mov al,[bx] ; берем 1 байт по этому указателю
[C++] borland C++ 3.1.Оператор присвоения не работает??? 10.10.03 21:32  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
> Кто что может сказать по этому поводу?
> ps DOS программа. компилятор - сабж.

Попробовал получить асмовый листинг
из такой программы

#include <stdio.h>
void main(void) {
extern unsigned char buff512_r[512];
unsigned long table[256];
char* chain_ptr= (char*)table[buff512_r[0]];
printf(chain_ptr);
}

bcc 5.1.1
; extern unsigned char buff512_r[512];
; unsigned long table[256];
; char* chain_ptr= (char*)table[buff512_r[0]];
;
@1:
xor eax,eax
mov al,byte ptr [_buff512_r]
mov eax,dword ptr [ebp+4*eax-1024]

turbo C 3.0
; extern unsigned char buff512_r[512];
; unsigned long table[256];
; char* chain_ptr= (char*)table[buff512_r[0]];
;
mov al,byte ptr DGROUP:_buff512_r
mov ah,0
shl ax,2
lea dx,word ptr [bp-1028]
add ax,dx
mov bx,ax
mov ax,word ptr ss:[bx+2]
mov dx,word ptr ss:[bx]
mov word ptr [bp-2],ax
mov word ptr [bp-4],dx

Все вроде бы так и должно быть
З.Ы. какую модель памяти ты используешь при компиляции
[C++] borland C++ 3.1.Оператор присвоения не работает??? 10.10.03 21:51  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
привет, давай в аське это обсудим..так легче.... а результат бесед обязуюсь запостить
стучись : 126092913
[C++] сорри 10.10.03 22:05  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
> привет, давай в аське это обсудим..так легче.... а
> результат бесед обязуюсь запостить
> стучись : 126092913
я сейчас на работе и уже ухожу, буду только в понедельник, если проблема не решиться то постучусь
<без заголовка> 10.10.03 22:09  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > привет, давай в аське это обсудим..так легче.... а
> > результат бесед обязуюсь запостить
> > стучись : 126092913
> я сейчас на работе и уже ухожу, буду только в понедельник,
> если проблема не решиться то постучусь

ладно.. если быстренько:
в общем мои все претензии к mov al,[bx]
имхо там не должно быть скобок..так как мы берем значение buff512_r[0] еще в строчке mov bx,[_buff512_r] и ЕГО(bx) должны умножны умножать на 4.

почему же там стоят скобки???
<без заголовка> 10.10.03 22:32  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > > привет, давай в аське это обсудим..так легче....
> а
> > > результат бесед обязуюсь запостить
> > > стучись : 126092913
> > я сейчас на работе и уже ухожу, буду только в
> понедельник,
> > если проблема не решиться то постучусь
>
> ладно.. если быстренько:
> в общем мои все претензии к mov al,[bx]
> имхо там не должно быть скобок..так как мы берем значение
> buff512_r[0] еще в строчке mov bx,[_buff512_r] и ЕГО(bx)
> должны умножны умножать на 4.
>
> почему же там стоят скобки???


насчет [bx] вопрос отпадает ...это моя ошибка ... я забыл что buff у меня указатель ((( но факт что присваиваются разные значения остается
А насчет far ptr 11.10.03 17:44  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> насчет [bx] вопрос отпадает ...это моя ошибка ... я забыл
> что buff у меня указатель ((( но факт что присваиваются
> разные значения остается
Указатель в DOS-е - это по умолчанию near ptr, а ты ему присваиваешь unsigned long. Непонятно как он это делает
Все зависит от выбранной модели памяти 13.10.03 13:10  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
Ну да 13.10.03 13:40  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Только опять таки по умолчанию у BC3.1 стоит модель small, если я не ошибаюсь, и по умолчанию все указатели в этой модели ближние.

Если сказал глупость - не сильно кидайте шапками: я уже сто лет ничего не делал под досом :-)
Все будет хорошо... 10.10.03 19:39  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
char* chain_ptr=(char*) (table[buff512_r[0]]);

:-)
тема не закрыта! 10.10.03 19:44  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> char* chain_ptr=(char*) (table[buff512_r[0]]);
>
> :-)
;_)
это не ответ
Нет, это ответ, потому что скобки добавились 10.10.03 19:50  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
увы... 10.10.03 21:20  
Автор: gkar21h Статус: Незарегистрированный пользователь
<"чистая" ссылка>
да, не заметил...
ps только что опробоал - результат тот же ((
mov al,[bx]
1






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


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