|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Вт Июл 11, 2006 12:01 am Заголовок сообщения: |
|
|
Что-то разговор вообще отошёл от темы. Тема называется "Сжатая графика Pac-man 2(SEGA)". Выше я привёл код процедуры распаковки LZ, которым запакована почти вся графика в игре, и сказал, что могу разъяснить, как она работает, чтобы афтару стал понятен алгоритм распаковки и запаковки и можно было написать пакер. HoRRoR, тебе нужно описание? _________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Июл 11, 2006 7:02 am Заголовок сообщения: |
|
|
КОНЕЧНО!!!!!!! |
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Вт Июл 11, 2006 1:54 pm Заголовок сообщения: |
|
|
Советую отдебужить этот код для лучшего понимания алгоритма. Для примера будем использовать основной шрифт (адрес 160073). Просто поставь брякпоинт в GensDebug на 0415C6 перед появлением логотипа SEGA. Предположим, что мы уже зашли в процедуру распаковки, тогда в регистре A0 должно быть записано 160073. А A1 указывает на FF7000. В любой момент A1 указывает на ту ячейку, в которую будет записано значение, но пока она ещё не обработана. Итак,
Код: | 000016E2 MOVE.B (A0)+,D3
000016E4 MOVEQ #$01,D4
000016E6 LSL.W D3,D4
000016E8 SUBQ.W #$1,D4 |
Из начала сжатых данных всегда считывается один байт. Его предназначение таково: как известно, для LZ надо указывать, на сколько байт смотреть назад (указатель) относительно текущей позиции, и количество повторяемых байт; всего в нашем алгоритме под указатель и число повторений отводится два байта (см. ниже), а в этом первом байте указывается, сколько бит отводится под указатель. В нашем примере это 0B, т.е. под указатель 11 бит, а под число повторений - оставшиеся 5 бит. После логического сдвига (строка 16E6), аналогичного возведению двойки в степень, получаем "размер словаря", в нашем случае это 2^11=2048=800h байт. Далее, из D4 вычитается 1 (получится D4=000007FF), это надо для усечения больших указателей (чтобы они не превышали размер словаря) командой AND (строка 1708).
Теперь собственно разжатие.
Код: | 000016EA MOVE.B (A0)+,D0
000016EC BEQ $0000172C |
Считывается "управляющий" байт. Если он нулевой, мы выходим из процедуры, распаковка закончена.
Код: | 000016EE LSR.B #1,D0
000016F0 BEQ $000016EA
000016F2 BCC $000016F8 |
Последовательно просматриваются биты управляющего байта, начиная с младшего. Команда LSR сдвигает все биты D0 вправо, а самый правый бит записывается во флаг C. Если байт D0 стал нулевым (BEQ), возвращаемся к чтению следующего управляющего байта. {По-моему, этот момент немного глуп, т.к. так просматриваются не все биты (см. в конце), и если нам надо несколько раз применить LZ, которому соответствует нулевой бит (см. ниже), и так совпадёт, что все нулевые управляющие (т.е. указывающие, что надо применить LZ) биты находятся в старшей части байта, то они не будут просмотрены, т.к. байт к тому времени станет нулевым, и придётся считывать следующий байт. Таким образом, нельзя применить LZ больше 7 раз подряд, потому что при применении >=8 раз весь управляющий байт был бы нулевым и от него не было бы толку. Решение проблемы см. в конце} Если выдвинутый бит нулевой (команда BCC), то переходим к LZ-распаковке (начиная с 16F8), иначе
Код: | 000016F4 MOVE.B (A0)+,(A1)+
000016F6 BRA $000016EE |
просто считываем несжатый байт и возвращаемся к просмотру битов управляющего байта (16EE). В нашем примере 1-й байт равен FF, следовательно мы просто считаем 7 байт (не 8, потому что после 8-го сдвига байт станет нулевым).
Отсюда идёт сама LZ-распаковка:
Код: | 000016F8 CMP.B #$08,D3
000016FC BEQ $00001712 |
Если под указатель отводится 8 бит (ровно байт), то под число повторений тоже 1 байт, поэтому применяется упрощённая схема чтения указателя (переход к строке 1712).
Если указатель не 8-битный, то из считанного слова (см. ниже) надо извлечь отдельно указатель и отдельно число повторений.
Код: | 000016FE MOVE.B (A0)+,D1
00001700 LSL.W #8,D1
00001702 MOVE.B (A0)+,D1 |
Читаем слово. Здесь нельзя применить move.w (a0)+,d1, т.к. a0 может оказаться нечётным, а с нечётных адресов нельзя читать слова.
Итак, мы имеем слово, содержащее указатель и число повторов. В нашем примере первое такое слово равно 2804h=0010 1000 0000 0100b. В младших 11 битах хранится "указатель" - число, которое надо вычесть из текущего адреса (регистр A1), чтобы получить тот адрес, с которого надо повторять байты. Как видно, это 0 0000 0100b = 4h. В нашем примере A1 в этот момент равен 00FF700F, значит, байты надо повторять с адреса 00FF700F - 4 = 00FF700B. В старших пяти битах хранится число повторений: 0010 1b = 5h, т.е. надо повторить пять байт с адресов FF700B-FF7010 в адреса FF700F-FF7013.
Код: | 00001704 MOVE.W D1,D2
00001706 SUBQ.W #$1,D2
00001708 AND.W D4,D2
0000170A SUB.W D4,D1
0000170C SUBQ.W #$1,D1
0000170E LSR.W D3,D1
00001710 BRA $0000171E |
Извлекаем отдельно указатель (регистр D2) с помощью сдвигов и число повторений минус 1 в D1. Вычитание единицы нужно для цикла с постусловием: если D1=0, цикл повторится 1 раз, если D1=1, 2 раза и т.д.
Код: | 00001712 MOVEQ #$00,D2
00001714 MOVEQ #$00,D1
00001716 MOVE.B (A0)+,D1
00001718 SUBQ.B #$1,D1
0000171A MOVE.B (A0)+,D2
0000171C SUBQ.B #$1,D2 |
Упрощённое чтение указателя и числа повторений (если каждое значение по 8 бит).
Код: | 0000171E NEG.W D2
00001720 LEA $FF(A1,D2.L),A2 |
Берём отрицание указателя (для вычитания его из текущего адреса) и получаем адрес для повторений.
Код: | 00001724 MOVE.B (A2)+,(A1)+
00001726 SUBQ.W #$1,D1
00001728 BCC $00001724 |
Копирование байтов в цикле с постусловием.
Код: | 0000172A BRA $000016EE |
Возвращаемся к просмотру управляюещго байта.
Выход.
Думаю, самый непонятный момент будет с преждевременным выходом из просмотра управляющего байта (строка 16F0). Объясню подробнее, в чём дело:
пусть D0=EFh=1110 1111b
После 4 сдвигов мы скопируем 4 байта из рома, затем применим 1 раз LZ, затем после ещё 2 сдвигов (всего получается 4+2+1=7) скопируем ещё 2 байта, и будет D0=01h=0000 0001b. Этот единичный бит указывает на то, что надо скопировать ещё один байт, но после сдвига байт D0 становится нулевым, проверка на ноль идёт раньше, чем проверка на значение бита (строки 16F0 и 16F2), поэтому мы перейдём к чтению следующего управляющего байта, а бит просто потеряется.
Как видно, самый старший бит в любом случае теряется, это надо учесть. Лучше делать его всегда единичным, чтобы не потерялись предыдущие нулевые биты (т.к. байт D0 может стать нулевым уже не после 7, а после 6 и т.д. сдвигов). Поэтому если мы хотим применить LZ 8 раз подряд, надо сделать отдельно 7 раз LZ (байт 80h=1000 0000b), а оставшийся 1 раз LZ указывать уже в следующем управляющем байте. _________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Июл 11, 2006 2:36 pm Заголовок сообщения: |
|
|
Большое спасибо, сейчас буду разбираться. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Июл 11, 2006 3:51 pm Заголовок сообщения: |
|
|
Пока что вот что накатал:
Код: |
Dim bte as byte
Dim adres as integer
adres=1
Get #1, A0, D3 '000016E2 B
A0=A0+1
D4=1 '000016E4 W
D4=Val(Right$(Hex$(D4*(2^D3)),4))'000016E6 W
D4=D4-&H100 '000016E8 B
L000016EA:
Get #1, A0, bte '000016EA B
D0=bte
A0=A0+1
If D0=0 Then Goto L0000172C '000016EC
L000016EE:
If D0/2=int(D0/2) then rbit=0 else rbit=1 '000016EE B
D0=Val(Right$(D0*(2^(-1))),2)
If D0=0 then Goto L000016EA '000016F0
If rbit=0 then GoTo L000016EA '000016F2
Get #1, A0, bte '000016F4 B
Put #2, adres, bte
A1=A1+1
adres=adres+1
GoTo L000016EE '000016F6
'000016F8 B
If D3=8 Then GoTo L00001712 '000016FC
Get #1, A0, bte '000016FE B
D1=bte
A0=A0+1
D1=Val(Right$(Hex$(D1*(2^8)),4))'00001700 W
Get #1, A0, bte '00001702 B
D1=bte
A0=A0+1
D2=D1 ' 00001704 W
D2=D2-1 ' 00001706 W
|
Ну как, у меня получается?
[edit]
Нет, тут не правильно. Никак не могу понять, почему D4=2^D3? Ведь логический сдвиг проводится с D4, а в операции 2^D3 его нет, что я проглядел?
[edit]
Немного подправил код.
[edit]
Подожди ка, чтобы число сдвинуть влево, надо его умножить на два в степени кол-ва сдвижений?
[edit]
Еще раз подправил код. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 12, 2006 9:37 am Заголовок сообщения: |
|
|
Кстати, насчет аватары. Может IE с PNG не всегда дружит? |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 12, 2006 12:39 pm Заголовок сообщения: |
|
|
А как понять "LEA $FF(A1,D2.L),A2"? |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 12, 2006 3:34 pm Заголовок сообщения: |
|
|
Начинаю потихоньку въезжать - я ступил, что пытался понять именно по коду, а когда в hex-едиторе открыл, потихоньку доходить начало. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 12, 2006 6:09 pm Заголовок сообщения: |
|
|
ВРОДЕ ПОНЯЛ...
Да, правда PEREVODчик сказал, я правда офигел, когда узнал насколько он прост. Это код сложный(для меня, по крайней мере), а алгоритм прост, как незнаю что. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Ср Июл 12, 2006 6:36 pm Заголовок сообщения: |
|
|
Пока сам не разберёшься, ничьи подталкивания не помогут осмыслить СУТЬ, все чужие советы способны лишь вдолбить конкретные примеры. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 13, 2006 11:58 am Заголовок сообщения: |
|
|
ПОМОГИТЕ!!! Я написал прогу, но когда она разпаковывает 16 тайлов(512 байт), дальше указатели становятся слишком большими и идет всякая чушь, потипу числа повторений 0. В чем дело??? Может там какой промежуточный байт есть? И что такое "словарь"? Для чего нужен его размер? |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 13, 2006 1:04 pm Заголовок сообщения: |
|
|
Цитата: | идет всякая чушь, потипу числа повторений 0 |
Это я ошибся, но указатели действительно слишком большие, например заполнено всего 512 байт а указатель равен 544 байтам(это указатель 01000100000, кол-во повторов 00100(байты 20 22 по адресу $16016D). Как с эти бороться? |
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Чт Июл 13, 2006 2:30 pm Заголовок сообщения: |
|
|
Не знаю, как у твоего анпакера получилось, что указатель по адресу $16016D, дебуггер показывает, что указатель по адресу $16016B, там написано 0002, т.е. указатель извлекается как двойка, а число повторений действительно как бы 0 (это если по битам читать), но там так устроено, что 0 интерпретируется как максимум, т.е. в данном случае $20=32 повторения (потому что 5 бит на число повторений). Ща свой напишу.
И не забывай, у Моторолы идёт прямой порядок байт, т.е. в каком порядке они записаны в памяти, в таком они идут в самом числе, так что по адресу $16016D записано не 2022, а 2220. _________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 13, 2006 2:48 pm Заголовок сообщения: |
|
|
GHOST, СПАСИБО ОГРОМНОЕ!!!!!!!!!!
Из-за этого нуля и не работало! Еще раз спасибо, век буду благодарен! |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 13, 2006 3:07 pm Заголовок сообщения: |
|
|
Ghost писал(а): | Не знаю, как у твоего анпакера получилось, что указатель по адресу $16016D, дебуггер показывает, что указатель по адресу $16016B, там написано 0002 |
Ну правильно, а следующий указатель по адресу $16016D. Управляющий байт 80 - 10000000, находится по адресу $160166, это значит, что будет считываться 7 раз по два байта(вернее по одному указателя), 2220 по адресу $16016D считается 4-ым по счету.
Главное, что анпакер заработал, скоро допишу до пакера.
Ghost писал(а): | И не забывай, у Моторолы идёт прямой порядок байт, т.е. в каком порядке они записаны в памяти, в таком они идут в самом числе, так что по адресу $16016D записано не 2022, а 2220. |
Это я просто ошибся. |
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Чт Июл 13, 2006 4:34 pm Заголовок сообщения: |
|
|
Щет, я уже анпакер написал. Вотъ, если у тя паскаль есть, скомпиль (тока я не стал делать для имён файлов paramstr, просто имя в проге меняй, и адрес для распаковки там же).
Код: | {$G+}
var f,fa:file;
bufr:array[0..16383] of byte;
bufw:array[0..32767] of byte;
res,d4:word;
d0:byte;
begin
assign(f,'pac-man2.bin');
reset(f,1);
assign(fa,'pacman2.bin');
rewrite(fa,1);
seek(f,$160073);
blockread(f,bufr,sizeof(bufr),res);
asm
lea di,bufw
lea bx,bufr
mov cl,[bx]
inc bx
mov ax,1
shl ax,cl
dec ax
mov d4,ax
@u_byte:
mov al,[bx]
inc bx
test al,al
jz @exit
mov d0,al
@lsr:
shr d0,1
jz @u_byte
jae @lz
mov ah,[bx]
inc bx
mov [di],ah
inc di
jmp @lsr
@lz:
mov ax,[bx]
add bx,2
rol ax,8
mov dx,ax
dec dx
and dx,d4
inc dx
sub ax,d4
dec ax
shr ax,cl
inc ax
mov si,di
sub si,dx
@copying:
mov ch,[si]
inc si
mov [di],ch
inc di
dec ax
jnz @copying
jmp @lsr
@exit:
sub di,offset bufw
mov res,di
end;
blockwrite(fa,bufw,res,res);
close(f);
close(fa);
end. |
_________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 13, 2006 4:55 pm Заголовок сообщения: |
|
|
Спасибо. Где-то у меня кажись на харде досовский турбо-паскаль пылится, если найду и разберусь, где там имя а где адрес, то скомпилю.
А вот мой код(VB знаю где-то на три, поэтому так нерационально): Код: |
Dim bte As Byte
Dim uprbyte As Integer
Open file1 For Binary As 1
Open file2 For Binary As 2
adr2 = 1
adr1 = Val("&H" + Adress) + 1
Get #1, adr1, bte
'MsgBox "Считан начальный байт " & Hex(bte) & " по адресу " & Hex$(adr1 - 1)
adr1 = adr1 + 1
num = 16 - bte
dic = 2 ^ bte - 1
getuprbyte:
Get #1, adr1, bte
'MsgBox "Считан управляющий байт " & Hex(bte) & " по адресу " & Hex$(adr1 - 1)
cnt = 0
adr1 = adr1 + 1
uprbyte = bte
If uprbyte = 0 Then
'MsgBox "Управляющий байт по адресу " & Hex$(adr1) & " равен нулю - выход."
GoTo ENDUNP
End If
count:
cnt = cnt + 1
If cnt = 8 Or uprbyte = 0 Then GoTo getuprbyte '
If uprbyte / 2 = Int(uprbyte / 2) Then rbit = 0 Else rbit = 1
'MsgBox "Правый бит байта " & Hex(uprbyte) & " равен " & rbit
uprbyte = uprbyte \ 2
If rbit = 1 Then
Get #1, adr1, bte: adr1 = adr1 + 1
Put #2, adr2, bte: adr2 = adr2 + 1
'MsgBox "Правый бит равен 1, просто считываем байт " & Hex(bte) & " по адресу " & Hex(adr1 - 2) & " и пишем байт " & Hex(bte) & " по адресу " & Hex(adr2 - 2)
GoTo count
Else
Get #1, adr1, bte: adr1 = adr1 + 1: pbyte1 = bte
Get #1, adr1, bte: adr1 = adr1 + 1: pbyte2 = bte
'MsgBox "Правый бит равен 0, читаем байты " & Hex(pbyte1) & " и " & Hex(pbyte2) & " по адресу " & Hex(adr1 - 3)
pbyte = (pbyte1 * 256) + pbyte2
For koef = 1 To 16
If pbyte / 2 = pbyte \ 2 Then bitst = "0" & bitst Else bitst = "1" & bitst
pbyte = pbyte \ 2
Next koef
bits2 = Right$(bitst, 16 - num)
bits1 = Left$(bitst, num)
For r = 0 To Len(bits1) - 1
byte1 = byte1 + Val(Mid(bits1, Len(bits1) - r, 1)) * (2 ^ r)
Next r
For r = 0 To Len(bits2) - 1
byte2 = byte2 + Val(Mid(bits2, Len(bits2) - r, 1)) * (2 ^ r)
Next r
& " . Переводим в числа, первый байт " & byte1 & " , второй байт " & byte2
If byte2 = 0 Then byte2 = 2048
adr2b = adr2 - byte2
If adr2b < 1 Then MsgBox adr2b & " " & adr2 & " - " & byte2 & "|||" & Hex(adr1 - 3) & " " & bitst
If byte1 = 0 Then byte1 = 32
For cntr = 1 To byte1
Get #2, adr2b, bte: adr2b = adr2b + 1
Put #2, adr2, bte: adr2 = adr2 + 1
If bte < 0 Then MsgBox adr1 & " " & adr2 & " " & adr2b
Next cntr
End If
bitst = ""
pbyte = 0
bits = 0
bitsn1 = 0
bitsn2 = 0
byte1 = 0
byte2 = 0
adr2b = 0
GoTo count
MsgBox "Почему выход?"
ENDUNP:
Close
MsgBox "Всё!"
|
[edit]
Подправил код, была та же проблема с нулём, но только не в количестве повторов, а в указателях. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пт Июл 14, 2006 8:55 am Заголовок сообщения: |
|
|
А что такое "брякпоинты" и вообще, как правильно дебаггером пользоваться? |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пт Июл 14, 2006 1:47 pm Заголовок сообщения: |
|
|
Как вам заставочка?
Если не видно, качать FlashGet'ом. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пт Июл 14, 2006 2:17 pm Заголовок сообщения: |
|
|
HoRRoR писал(а): | Как вам заставочка? |
Жить можно. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пт Июл 14, 2006 2:29 pm Заголовок сообщения: |
|
|
АнС писал(а): | HoRRoR писал(а): | Как вам заставочка? |
Жить можно. |
Если бы не кой-какие проблемы, жить было бы еще можнее . |
|
Вернуться к началу |
|
|
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Пт Июл 14, 2006 7:52 pm Заголовок сообщения: |
|
|
HoRRoR писал(а): | А что такое "брякпоинты" и вообще, как правильно дебаггером пользоваться? |
Ты что, до сих пор не знаешь, что такое брякпоинт. В общем, брякпоинт (или просто бряк или breakpoint или если хочешь Контрольная Точка ) нужен для того, чтобы затормозить выполнение программы в определённом месте. Например, по адресу h0001C045 (то есть, программы останавливает своё выполнение как только она дойдёт до этого адреса) или на флаг нуля или на команду или другое действие.
Ну как правильно пользоваться дебагером зависит только от дебагера. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пт Июл 14, 2006 8:30 pm Заголовок сообщения: |
|
|
Ura_Orlov писал(а): | HoRRoR писал(а): | А что такое "брякпоинты" и вообще, как правильно дебаггером пользоваться? |
Ты что, до сих пор не знаешь, что такое брякпоинт. В общем, брякпоинт (или просто бряк или breakpoint или если хочешь Контрольная Точка ) нужен для того, чтобы затормозить выполнение программы в определённом месте. Например, по адресу h0001C045 (то есть, программы останавливает своё выполнение как только она дойдёт до этого адреса) или на флаг нуля или на команду или другое действие.
Ну как правильно пользоваться дебагером зависит только от дебагера. |
А где его ставить то? |
|
Вернуться к началу |
|
|
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Пт Июл 14, 2006 10:17 pm Заголовок сообщения: |
|
|
HoRRoR писал(а): | Ura_Orlov писал(а): | HoRRoR писал(а): | А что такое "брякпоинты" и вообще, как правильно дебаггером пользоваться? |
Ты что, до сих пор не знаешь, что такое брякпоинт. В общем, брякпоинт (или просто бряк или breakpoint или если хочешь Контрольная Точка ) нужен для того, чтобы затормозить выполнение программы в определённом месте. Например, по адресу h0001C045 (то есть, программы останавливает своё выполнение как только она дойдёт до этого адреса) или на флаг нуля или на команду или другое действие.
Ну как правильно пользоваться дебагером зависит только от дебагера. |
А где его ставить то? |
В GensDebuger. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пт Июл 14, 2006 11:13 pm Заголовок сообщения: |
|
|
Ura_Orlov писал(а): | В общем, брякпоинт (или просто бряк или breakpoint или если хочешь Контрольная Точка ) |
Контрольная точка - это чекпоинт, а бряк - это Точка Останова. Я не придираюсь, просто на заметку. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|