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





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


насчет [bx] вопрос отпадает ...это моя ошибка ... я забыл что buff у меня указатель ((( но факт что присваиваются разные значения остается
<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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach