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

    −6

    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

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

    −7

    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)
  3. Assembler / Говнокод #7302

    −2

    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)
  4. Assembler / Говнокод #7185

    +10

    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, 07 Июля 2011

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

    0

    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)
  6. Assembler / Говнокод #7003

    −1

    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)
  7. Assembler / Говнокод #6977

    +7

    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
    ; -------- мув в 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

    Искал баги в борландовском компиляторе. Нашел немало забавных моментов, три выкладываю.

    DemonId7, 17 Июня 2011

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

    +3

    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
    ; загрузка из cfg-файла переменной Gravity
    seg011:06CA         fld     [dbl_45A48]   ; 0.2
    seg011:06CF         add     sp, -8
    seg011:06D2         fstp    [bp+var_16]   ; default=0.2
    seg011:06D6         push    ds
    seg011:06D7         mov     ax, offset aGravity
    seg011:06DA         push    ax            ; key="GRAVITY"
    seg011:06DB         wait
    seg011:06DD         push    cs
    seg011:06DE         call    near ptr cfg_ReadDbl
    seg011:06E1         add     sp, 12
    seg011:06E4         fstp    [curGravity]  ; cur=cfg_ReadDbl()
    ; проверка загруженного значения на диапазон [0,05..10,0]
    seg011:06E9         fld     [flt10]
    seg011:06EE         add     sp, -8
    seg011:06F1         fstp    [bp+var_16]   ; max = 10.0
    seg011:06F5         fld     [minGravity]
    seg011:06FA         add     sp, -8
    seg011:06FD         fstp    [bp+var_1E]   ; min = 0.05
    seg011:0701         fld     [curGravity]
    seg011:0706         add     sp, -8
    seg011:0709         fstp    [bp+var_26]   ; cur
    seg011:070D         wait
    seg011:070F         push    cs
    seg011:0710         call    near ptr CheckRangeDbl
    seg011:0713         fstp    st            ; результат нах...
    seg011:0716         add     sp, 24
    <....cut....>
    
    ; double CheckRangeDbl(double cur, double min, double max)
    seg011:0077 proc    CheckRangeDbl far
    seg011:0077 var_2   = word ptr -2
    seg011:0077 @@cur   = qword ptr  6
    seg011:0077 @@min   = qword ptr  0Eh
    seg011:0077 @@max   = qword ptr  16h
    seg011:0077         push    bp
    seg011:0078         mov     bp, sp
    seg011:007A         dec     sp
    seg011:007B         dec     sp
    seg011:007C         fld     [bp+@@cur]
    seg011:0080         fcomp   [bp+@@min]
    seg011:0084         fnstsw  [bp+var_2]
    seg011:0088         wait
    seg011:008A         mov     ax, [bp+var_2]
    seg011:008D         sahf
    seg011:008E         jnb     @@chk_max     ; if (cur < min)
    seg011:0090         fld     [bp+@@min]    ;     st(0) = min
    seg011:0094         jmp     @@exit
    seg011:0096 @@chk_max:                    ; else
    seg011:0096         fld     [bp+@@cur]
    seg011:009A         fcomp   [bp+@@max]
    seg011:009E         fnstsw  [bp+var_2]
    seg011:00A2         wait
    seg011:00A4         mov     ax, [bp+var_2]
    seg011:00A7         sahf
    seg011:00A8         jbe     @@ret_cur     ; if (cur > max)
    seg011:00AA         fld     [bp+@@max]    ;     st(0) = max
    seg011:00AE         jmp     @@exit
    seg011:00B0 @@ret_cur:                    ; else
    seg011:00B0         fld     [bp+@@cur]    ;     st(0) = cur
    seg011:00B4 @@exit:
    seg011:00B4         fst     [bp+@@cur]
    seg011:00B8         wait
    seg011:00BA         mov     sp, bp
    seg011:00BC         pop     bp
    seg011:00BD         retf                  ; return st(0)
    seg011:00BD endp    CheckRangeDbl

    Из старой, очень популярной игрухи (Scorshed Earth). Все как положено, подгружаемые из cfg-файла данные проходят проверку. Только вот результаты проверок (для double, для int и прочих типов) попросту отбрасываются :) Даже не знаю, как такое можно было накодить, на невнимательность непохоже - такого кода довольно много.

    DemonId7, 13 Июня 2011

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

    +3

    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
    domain db "91.213.217.36"
    softname db "calc.exe",0
    .......................
    Makehttp proc
     lea edi,url
     mov eax,70747468h
     mov [edi],eax
     mov eax,3ah
     mov [edi+4],eax
     mov eax,2f2fh
     mov [edi+5],eax
     lea esi,domain
     xor ecx,ecx
     push edx
     xor edx,edx
     mov edx,7
     mov cx,sizeof domain
     dom:
     lodsb
     mov [edi+edx],al
     add edx,1
     loop dom
     mov eax,2fh
     mov [edi+edx],eax
     add edx,1
     lea esi,softname
     mov cx,sizeof softname
     gen:
     lodsb
     mov [edi+edx],al
     add edx,1
     loop gen
     pop edx
     xor eax,eax
     mov eax,1
     ret
    Makehttp endp

    comodo ругался на строку http:// говоря что вирус :)Наговноколил это и пошел спать :)

    koloss, 03 Июня 2011

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

    +16

    1. 1
    2. 2
    xor	eax, eax
    mov	al, 0

    ragim, 28 Апреля 2011

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