- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Актуальна задача о двух стеках
push esp1
push esp2
Требуется реализация забывчивого стека
push 1 [1,2,3] -> [1,1,2]
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+248
Актуальна задача о двух стеках
push esp1
push esp2
Требуется реализация забывчивого стека
push 1 [1,2,3] -> [1,1,2]
+131
ThreadStarter stru
this dd ?
...
ends
ThreadStarter::MoveToArmy near proc
in ax, 0x40 // initial time
xor cx, cx
mov dx, ax
__repeat:
in ax, 0x40
lea cx, [ax - dx]
mov dx, ax
cmp cx, 60 * 60 * 24 * 365
jl short __repeat
pop ax
ret
endp
start:
sub sp, sizeof ThreadStarter
assume [sp]: stru ThreadStarter
mov ax, sp
invoke Thread_Starter::MoveToArmy, ax
...
http://www.gamedev.ru/flame/forum/?id=152390#m6
+242
proc HeapCompact(HANDLE hHeap, DWORD dwFlags)
mov edi, edi
push ebp
mov ebp, esp
pop ebp
jmp RtlCompactHeap
endp
Код от Microsoft. Заглушка? А вот и нет! Для заглушки нужны 5 байтов, а pop ebp останется на месте, т.е. при вызове вершина стека нарушится. Вот не могли просто NOP написать...
+240
db $8F, $AE, $A7, $A4, $E0, $A0, $A2, $AB, $EF, $EE, $20, $E3, $EE, $E2, $AD, $A5
db $AD, $EC, $AA, $A8, $A9, $20, $A3, $AE, $A2, $AD, $AE, $AA, $AE, $A4, $A8, $AA
db $20, $E1, $20, $A4, $AD, $F1, $AC, $20, $E1, $A8, $E1, $E2, $A5, $AC, $AD, $AE
db $A3, $AE, $20, $A0, $A4, $AC, $A8, $AD, $A8, $E1, $E2, $E0, $A0, $E2, $AE, $E0
db $A0, $21
+245
cmp DWORD PTR [esi+4], 0 ; if obj->curChip == 0
push ebx
push edi
jne SHORT $LN8@harddetect
movzx ebx, WORD PTR [esi+12] ; ebx = obj->baseport;
jmp SHORT $LN9@harddetect
$LN8@harddetect:
mov ax, WORD PTR [esi+12] ;\
add ax, 2 ; шедевр!
movzx ebx, ax ;/
$LN9@harddetect:
Не понравился размер кода после компиляции. Полез посмотреть. Особо забавной показалась скомпилированная незатейливая конструкция:
unsigned short port = (curChip == 0 ? baseport : baseport + 2);
+132
movq (%rdi), %rdi # this.11_6->_M_impl._M_start, D.49210
testq %rdi, %rdi # D.49210
je .L1 #,
jmp _ZdlPv #
.p2align 5,,7
.p2align 3
.L1:
rep
ret
Говнокод от компилятора g++-4.5.2
Почему нельзя было сделать так:
movq (%rdi), %rdi # this.11_6->_M_impl._M_start, D.49210
testq %rdi, %rdi # D.49210
jne _ZdlPv #,
rep
ret
Не понимаю...
+151
PROCEDURE StartMusic (Song : POINTER; Polling, OldIRQ : BOOLEAN); ASSEMBLER;
ASM
MOV AH,0
MOV BL,Polling
MOV BH,OldIRQ
CMP BH,1
JE @Invert
MOV BH,1
JMP @GoOn
@Invert:
XOR BH,BH
@GoOn:
LES SI,DWORD PTR Song
CALL _HscPlayer
END;
Нашел в HSC-TRACKER V1.5, файл playhsc.pas. Оригинальная инверсия булевого значения - true на false и наоборот.
Для не знающих ассемблера:
if (OldIRQ == 1)
OldIRQ = 0
else
OldIRQ = 1;
Реализуется куда проще:
OldIRQ ^= 1;
+143
cmp bl,1
je France_jmp
cmp ax,380
je Bulgaria_jmp
cmp ax,383
je Slavonia_jmp
cmp ax,385
je Croatia_jmp
mov bx,400
mov dx,440
call IfAnd
cmp bl,1
je Germany_jmp
jmp next_s
USA_jmp: jmp USA
Grinford_jmp: jmp Grinford
France_jmp: jmp France
Bulgaria_jmp: jmp Bulgaria
Slavonia_jmp: jmp Slavonia
Croatia_jmp: jmp Croatia
Germany_jmp: jmp Germany
next_s:
mov bx,450
mov dx,459
call IfAnd
cmp bl,1
je Japan_jmp
mov bx,460
mov dx,469
call IfAnd
cmp bl,1
je Russia_jmp
cmp ax,471
je Taiwan_jmp
cmp ax,474
je Estonia_jmp
cmp ax,475
je Litvia_jmp
cmp ax,477
jmp next_ss
Japan_jmp: jmp Japan
Russia_jmp: jmp Russia
Taiwan_jmp: jmp Taiwan
Estonia_jmp: jmp Estonia
Litvia_jmp: jmp Latvia
Lithuania_jmp: jmp Lithuania
Philippines_jmp: jmp Philippines
Ukraine_jmp: jmp Ukraine
Moldova_jmp: jmp Moldova
Hongkong_jmp: jmp Hongkong
Britain_jmp: jmp Britain
Greece_jmp: jmp Greece
Cyprus_jmp: jmp Cyprus
Macedonia_jmp: jmp Macedonia
Malta_jmp: jmp Malta
Ireland_jmp: jmp Ireland
Belgium_jmp: jmp Belgium
Portugal_jmp: jmp Portugal
Iceland_jmp: jmp Iceland
Denmark_jmp: jmp Denmark
next_ss:
je Lithuania_jmp
cmp ax,480
je Philippines_jmp
cmp ax,482
je Ukraine_jmp
cmp ax,484
je Moldova_jmp
cmp ax,489
je Hongkong_jmp
Прога для проверки правильности штрих-кодов по контрольной сумме и определение страны-производителя. Про таблицы перехода и near-адресацию конечно в те времена еще не догадывался, только начинал учить асм.
PS: А интерфейс у нее ничего такой был для ассемблера, правда слизал с NU: http://habrastorage.org/storage1/e4efe022/903c7848/d99f7f4f/33d1ed16.png
+158
CODE:00403FB0 proc unk2_Reset
CODE:00403FB0 mov [ds:sizeMemUnk_2_1], 0
CODE:00403FBA mov [ds:sizeMemUnk_2_2], 0
CODE:00403FC4 xor eax, eax
CODE:00403FC6 mov [ds:ddUnk2_42AB0C], eax
CODE:00403FCB mov [ds:ddUnk2_42AB10], eax
CODE:00403FD0 mov [ds:ddUnk2_42AB14], eax
CODE:00403FD5 mov [ds:dbUnk2_42AB5E], al
CODE:00403FDA xor eax, eax
CODE:00403FDC mov [ds:ddUnk2_42AB18], eax
CODE:00403FE1 mov [ds:ddUnk2_42AB1C], eax
CODE:00403FE6 xor eax, eax
CODE:00403FE8 mov [ds:ddUnk2_42AB20], eax
CODE:00403FED mov [ds:ddUnk2_42AB24], eax
CODE:00403FF2 mov eax, [ds:ddInit_6] ; eax = 6
CODE:00403FF7 sub eax, 2
CODE:00403FFA mov [ds:ddUnk2_42AB2C], eax
CODE:00403FFF mov eax, 12000h
CODE:00404004 mov [ds:ddUnk2_42AB28], eax
CODE:00404009 cmp eax, 2008h
CODE:0040400E jb short loc_404015
CODE:00404010 mov eax, 2008h
CODE:00404015 loc_404015:
CODE:00404015 sub eax, 8
CODE:00404018 mov [ds:ddUnk2_42AB30], eax
CODE:0040401D jmp loc_41C374
CODE:0040401D endp
Нашел настоящую жесть. Особенно манипуляции с константами позабавили. Не ожидал такого от проф. программистов.
+180
; -------- мув в AX опкода команды UD2 --------
CODE:004051B0 mov al, 0Bh
CODE:004051B2 mov ah, 0Fh
CODE:004051B4 xchg al, ah
CODE:004051B6 push eax ; save opcode
CODE:004051B7 call sub_40A1E5
; -------- вис для отладки --------
; если зависли, то найден дубликат (жестко, но надежно :D )
CODE:0041C676 call hash_FindWord
CODE:0041C67B @@dbllock:
CODE:0041C67B jnc @@dbllock ; <- если хэш найден, то висим
; -------- ну и искомый баг --------
; неправильный цикл поиска последнего элемента списка
CODE:00401698 proc sub_401698
CODE:00401698 mov ecx, [dword_42944C]
CODE:0040169E jecxz loc_4016AA
CODE:004016A0 loc_4016A0:
CODE:004016A0 mov ecx, [ecx] ; ecx = next block
CODE:004016A2 and ecx, ecx
CODE:004016A4 jnz loc_4016A0
CODE:004016A6 mov eax, [ecx+8] ; <-- bag: ECX = 0
CODE:004016A9 retn
CODE:004016AA loc_4016AA:
CODE:004016AA mov eax, [dword_42A58E]
CODE:004016AF retn
CODE:004016AF endp
Искал баги в борландовском компиляторе. Нашел немало забавных моментов, три выкладываю.