1. Assembler / Говнокод #9059

    +149

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    org 100h
    Begin:
    call FPU_init
    fild [Number]	   ;сложение
    fidiv [Number2]    ;деление
    frndint 	   ;округление (в сторону нуля-
    call Ar_prog	   ;т. к. регистр RC установлен в 11)
    fimul [Number2]
    fild [Number]
    fisub [Number10]
    fidiv [Number3]
    frndint
    call Ar_prog
    fimul [Number3]
    fild [Number]
    fidiv [Number4]
    frndint
    call Ar_prog
    fimul [Number4]
    fincstp
    fincstp
    fadd st0, st2
    fsub st0, st6
    fist [Number9]
    call FPU_init
    fild [Number5]
    xor cx,cx
    Out1:
    fild [Number9]	   ;помещаем значение, полученное после вычитания
    inc cx		   ;увеличиваем cx
    fcom st1	   ;сравниваем значение с 10
    fstsw [Number14]
    mov ax, [Number14]
    sahf
    jb Out2 	   ;если меньше 10, перейти к Out2
    fdiv st0,st1	   ;делим на 10
    frndint 	   ;округляем
    fistp [Number12]   ;результат - в Number12
    fild [Number9]	   ;снова загружаем
    fprem		   ;остаток от деления на 10
    fiadd [Number15]   ;прибавляем 30h
    fistp [Number13]   ;выгружаем в память
    push [Number13]    ;толкаем в стек
    fild [Number12]    ;результат деления - в Number9
    fistp [Number9]
    jmp Out1	   ;цикл
    Out2:
    mov di, String	   ;записываем смещение строки
    fiadd [Number15]
    fist [Number13]
    push [Number13]
    Out3:
    pop dx		   ;выталкиваем коды цифр, начиная с конца
    mov [di],dl	   ;записываем их в строку
    inc di		   ;увеличиваем смещение
    loop Out3	   ;повторяем это
    mov [di], byte 24h ;записываем код конца строки для вывода
    mov dx, String	   ;записываем смещение строки в
    mov ah, 09h	   ;вызываем прерывание
    int 21h
    int 20h
    Ar_prog:
    fist [Number9]
    fimul [Number9]
    fild [Number9]
    fadd st0,st1
    fidiv [Number8]
    frndint
    ret
    FPU_init:
    finit		   ;инициализация сопроцессора
    fstcw [Number6]    ;получение контрольного слова
    mov ax, [Number7]  ;установка десятого и одиннадцатого
    or [Number6], ax   ;битов слова в 11 (можно две команды bts)
    fldcw [Number6]    ;загрузка контрольного слова в FPU
    ret
    Number dw 1000d
    Number2 dd 3d
    Number3 dw 5d
    Number4 dw 15d
    Number5 dw 10d
    Number6 dw ?
    Number7 dw 0c00h
    Number8 dw 2d
    Number9 dd ?
    Number10 dw 1d
    Number11 db 30h
    Number12 dd ?
    Number13 dw ?
    Number14 dw ?
    Number15 dd 0030h
    String db ?

    Первый в жизни осмысленный код. Я нормален?

    evgraf-klimov, 09 Января 2012

    Комментарии (52)
  2. Assembler / Говнокод #8245

    +248

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    Актуальна задача о двух стеках
    
    push esp1
    push esp2
    
    Требуется реализация забывчивого стека
    
    push 1 [1,2,3] -> [1,1,2]

    alexoy, 19 Октября 2011

    Комментарии (6)
  3. Assembler / Говнокод #7943

    +131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    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

    >14 сен. 2011 17:38
    Машинный код для шестнадцати битного режима
    Все привет. С началом учебы полнейший завал, времени нет вообще. Если вы знаете ссылки на сабж (прерывания, всякие mov, cmp, jmp и т.д.) поделитесь пожалуйста.
    Очень важно, что бы он был для шестнадцати битного режима, для ДОСа, не для Вин32.

    CPPGovno, 22 Сентября 2011

    Комментарии (6)
  4. Assembler / Говнокод #7383

    +242

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    proc HeapCompact(HANDLE hHeap, DWORD dwFlags)
    	mov     edi, edi
    	push    ebp
    	mov     ebp, esp
    	pop     ebp
    	jmp     RtlCompactHeap
    endp

    Код от Microsoft. Заглушка? А вот и нет! Для заглушки нужны 5 байтов, а pop ebp останется на месте, т.е. при вызове вершина стека нарушится. Вот не могли просто NOP написать...

    KIRK, 29 Июля 2011

    Комментарии (4)
  5. Assembler / Говнокод #7378

    +240

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    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

    TarasB, 29 Июля 2011

    Комментарии (18)
  6. Assembler / Говнокод #7313

    +245

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    cmp     DWORD PTR [esi+4], 0     ; if obj->curChip == 0
        push    ebx
        push    edi
        jne     SHORT [email protected]
        movzx   ebx, WORD PTR [esi+12]   ; ebx = obj->baseport;
        jmp     SHORT [email protected]
    [email protected]:
        mov     ax, WORD PTR [esi+12]    ;\
        add     ax, 2                    ; шедевр!
        movzx   ebx, ax                  ;/
    [email protected]:

    Не понравился размер кода после компиляции. Полез посмотреть. Особо забавной показалась скомпилированная незатейливая конструкция:

    unsigned short port = (curChip == 0 ? baseport : baseport + 2);

    Компилятор VC++ 2005, с оптимизацией по размеру генерируемого кода. Наоптимизировал :D

    DemonId7, 22 Июля 2011

    Комментарии (16)
  7. Assembler / Говнокод #7302

    +132

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    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

    Не понимаю...

    wecanstoptrain, 21 Июля 2011

    Комментарии (21)
  8. Assembler / Говнокод #7185

    +151

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    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;

    DemonId7, 06 Июля 2011

    Комментарии (9)
  9. Assembler / Говнокод #7126

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    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

    Tronix, 01 Июля 2011

    Комментарии (32)
  10. Assembler / Говнокод #7003

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    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

    Нашел настоящую жесть. Особенно манипуляции с константами позабавили. Не ожидал такого от проф. программистов.

    DemonId7, 20 Июня 2011

    Комментарии (19)