Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] borland C++ 3.1.Оператор присвоения не работает??? 10.10.03 18:51 Число просмотров: 1072
Автор: 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++] borland C++ 3.1.Оператор присвоения не работает??? - gkar21h 10.10.03 18:51 [1072]
|
|
|