- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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
bormand 28.03.2014 07:06 # 0
P.S. Можно было хоть немного отформатировать? Читать же невозможно...
bormand 28.03.2014 07:08 # 0
С левого - читаем цифру и прибавляем ее к ответу, домноженному на 10.
С правого - домножаем текущую степень на 10, умножаем ее на цифру и прибавляем к ответу. Да еще и сканить справа налево...
Автор не искал легких путей...
Lokich 28.03.2014 20:59 # +1
кстати вопрос по теме, я в инете так и не смог найти, там вообще есть какой-нибудь цикл типа for? или только какой-то свой каунтер с джампами?
bormand 28.03.2014 21:08 # +3
Опыт не пропьешь :) Но надо немного форматировать перед чтением - хотя бы на 1 отступ сдвинуть все кроме меток и отделить процедуры друг от друга и т.п.
> есть какой-нибудь цикл типа for
Конечно нет. Это же не какой-то там сраный язык высокого уровня :)
> каунтер с джампами
Да. Ну или jcxz - декремент счетчика и условный переход в одной команде.
bormand 28.03.2014 21:16 # +1
Это ты еще at&t синтаксис не видел...
Lokich 28.03.2014 21:31 # 0
bormand 28.03.2014 21:33 # 0
bormand 28.03.2014 07:24 # 0
И что-то не совсем понятно, как оно будет выставлять знак результата. Ведь оно никуда не сохранило знак из пары cx:bx, да и изначальное значение этой пары проебало.
Abbath 28.03.2014 13:24 # 0
Abbath 28.03.2014 21:16 # +1
bormand 28.03.2014 21:17 # 0
Abbath 28.03.2014 22:55 # 0
bormand 29.03.2014 07:13 # 0
При вызове процедуры снаружи?
bormand 28.03.2014 21:23 # 0
Abbath 28.03.2014 23:04 # 0
bormand 29.03.2014 07:12 # 0
Один код лучше другого :) Автору этих строк явно стоит уйти на языки высокого уровня...
Abbath 29.03.2014 10:09 # 0
Abbath 28.03.2014 23:16 # 0
bormand 29.03.2014 07:11 # 0
Abbath 29.03.2014 10:38 # 0
bormand 28.03.2014 21:30 # +1
- Небезопасная манера программирования. В частности, в программном обеспечении было много «трюкачества», а программные модули практически не тестировались поодиночке (бо́льшая часть тестирования производилась на готовом аппарате). Следует заметить, что всё ПО было написано на ассемблере, хотя в данном случае более мудрым решением было бы использовать язык высокого уровня.
Stertor 28.03.2014 21:44 # 0
Кроме этих явных ошибок было замечено множество потенциальных — например, в многозадачной операционной системе не было никакой синхронизации.
...