Сборный / Говнокод #15608 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
ascdec proc near
mov di,0
mov si,0
xor dx,dx
mov bx,offset buf
add bx,10
mov cx,11
lo0:
dec bx
dec cx
jcxz ex0
mov al,[bx]
cmp al,255
je lo0
lo1:
sub al,30h 
push bx
push cx
mov bx,offset deci
xor dx,dx
mov cx,word ptr[bx+2]
mov bx,word ptr[bx]
mov ah,0
call mult32 
add di,ax
adc si,dx
mov bx,offset deci
mov ax,[bx]
mov dx,[bx+2]
call multen
mov bx,offset deci
mov [bx],ax
mov [bx+2],dx
pop cx
pop bx
dec bx
dec cx
jcxz ex0
mov al,[bx]
jmp lo1
ex0:
mov ax,di
mov dx,si
test dx,8000h
jz enda
jmp error
enda:
cmp minus,2dh
jne pl1
call ccc
pl1:
ret
ascdec endp
multen proc near
push bx
push cx
mov bx,10
mov cx,0
call mult32
pop cx
pop bx
ret
multen endp
mult32 proc near 
push si
push di
push dx
push ax
test dx,8000h 
jz ml
call ucc
push dx
push ax
ml:
mov dx,cx
mov ax,bx
test dx,8000h  
jz ml0
call ucc 
mov bx,ax
mov cx,dx
ml0:
pop ax
pop dx
mov si,0
mov di,0
mul bx ;AX*BX
mov di,ax
mov si,dx
pop ax
mul cx ;AX*CX
add si,ax
pop dx
ucc proc near
dec ax
sbb dx,0
not ax
not dx
ret
ucc endp

Превращение строки в число.

Запостил: Abbath Abbath, (Updated )

Комментарии (22) RSS

  • Причем 32 битного...

    P.S. Можно было хоть немного отформатировать? Читать же невозможно...
    Ответить
    • Интересно, нахрена парсить число с правого края? Это же сложнее, чем с левого 😉

      С левого - читаем цифру и прибавляем ее к ответу, домноженному на 10.
      С правого - домножаем текущую степень на 10, умножаем ее на цифру и прибавляем к ответу. Да еще и сканить справа налево...

      Автор не искал легких путей...
      Ответить
    • я конечно не знаю асемблер, но как ты вообще это читаешь? 🙂
      кстати вопрос по теме, я в инете так и не смог найти, там вообще есть какой-нибудь цикл типа for? или только какой-то свой каунтер с джампами?
      Ответить
      • > но как ты вообще это читаешь?
        Опыт не пропьешь 🙂 Но надо немного форматировать перед чтением - хотя бы на 1 отступ сдвинуть все кроме меток и отделить процедуры друг от друга и т.п.

        > есть какой-нибудь цикл типа for
        Конечно нет. Это же не какой-то там сраный язык высокого уровня 🙂

        > каунтер с джампами
        Да. Ну или jcxz - декремент счетчика и условный переход в одной команде.
        Ответить
      • > как ты вообще это читаешь
        Это ты еще at&t синтаксис не видел...
        Ответить
        • типа этого?
          print_loop: // Начало цикла вывода массива
            pusha // Сохраняем все регистры
            pushl   (%eax)  // Кладем в стек элемент массива
            pushl   $print_format_array // Кладем в стек формат вывода ("%d ")
            call    printf // Вызываем printf (параметры функции кладутся в обратном порядке)
            addl    $8,         %esp // Выравниваем стек
            popa // Достаем из стека сохраненные регистры
            addl    $4,         %eax // Переходим к следующему элементу массива
            cmpl    $array_end, %eax // Сравниваем с адресом конца массива
            jne     print_loop // Если меньше, то переходим к выводу следуюшего элемента
          Ответить
          • Да. Только если в режиме extended вставки - там для полного счастья по два процента у регистров.
            Ответить
  • mult32 не влез полностью? Там ниже еще 2 умножения и корректировка знака?

    И что-то не совсем понятно, как оно будет выставлять знак результата. Ведь оно никуда не сохранило знак из пары cx:bx, да и изначальное значение этой пары проебало.
    Ответить
    • mult32 proc near 
      push si
      push di
      push dx
      push ax
      
      test dx,8000h 
      jz ml
      call ucc
      push dx
      push ax
      ml:
      mov dx,cx
      mov ax,bx
      test dx,8000h  
      jz ml0
      call ucc
      mov bx,ax
      mov cx,dx
      ml0:
      
      pop ax
      pop dx
      mov si,0
      mov di,0
      mul bx ;AX*BX
      mov di,ax
      mov si,dx
      
      pop ax
      mul cx ;AX*CX
      add si,ax
      
      pop dx
      mov ax,dx
      mul bx ;DX*BX
      add si,ax
      
      mov dx,si
      mov ax,di
      pop di
      pop si
      ret
      mult32 endp
      Ответить
      • Лол, умножение по модулю... Как я и думал - на знаки тупо забили.
        Ответить
      • А еще метку ml поставили не туда. Если в паре dx:ax было положительное число - прогу тупо распидорасит.
        Ответить
        • Откопал версию поновее.

          mult32 proc near 
          push si
          push di
          push dx
          push ax
          push dx
          push ax
          test dx,8000h 
          jz ml
          call ucc 
          ml:
          test cx,8000h  
          jz ml0
          mov ax,bx
          mov dx,cx
          call ucc 
          mov bx,ax
          mov cx,dx
          ml0:
          pop ax
          pop dx
          mov si,0
          mov di,0
          mul bx ;AX*BX
          mov di,ax
          mov si,dx
          
          pop ax
          mul cx ;AX*CX
          add si,ax
          
          pop dx
          mov ax,dx
          mul bx ;DX*BX
          add si,ax
          
          mov dx,si
          mov ax,di
          pop di
          pop si
          ret
          mult32 endp
          Ответить
          • Поменяли знак в паре dx:ax, запороли результат, да вернули все как было, восстановив старое значение из стека 😉

            Один код лучше другого 🙂 Автору этих строк явно стоит уйти на языки высокого уровня...
            Ответить
        • Еще поновее нашел.

          mult32 proc near 
          push si
          push di
          push dx
          push ax
          push dx
          push ax
          test dx,8000h 
          jz ml
          call ucc 
          push dx
          push ax
          ml:
          test cx,8000h  
          jz ml0
          mov ax,bx
          mov dx,cx
          call ucc
          mov bx,ax
          mov cx,dx
          ml0:
          pop ax
          pop dx
          
          mov si,0
          mov di,0
          mul bx ;AX*BX
          mov di,ax
          mov si,dx
          
          pop ax
          mul cx ;AX*CX
          add si,ax
          
          pop dx
          mov ax,dx
          mul bx ;DX*BX
          add si,ax
          
          mov dx,si
          mov ax,di
          pop di
          pop si
          ret
          mult32 endp
          Ответить
  • http://ru.wikipedia.org/wiki/Therac-25

    - Небезопасная манера программирования. В частности, в программном обеспечении было много «трюкачества», а программные модули практически не тестировались поодиночке (бо́льшая часть тестирования производилась на готовом аппарате). Следует заметить, что всё ПО было написано на ассемблере, хотя в данном случае более мудрым решением было бы использовать язык высокого уровня.
    Ответить
    • >>
      Кроме этих явных ошибок было замечено множество потенциальных — например, в многозадачной операционной системе не было никакой синхронизации.

      ...
      Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8