Lazar
Гость
|
|
« Ответ #3 : 20-05-2007 06:38 » |
|
Попробовал сделать по-другому. Прокомментировал процедуру Reconstruction. Не могу заставить цикл работать со всеми разрядами введенного значения. Складывает лишь два первых... Помогите разобраться!
GLOBAL _start SEGMENT .text _start: mov eax,4 mov ebx,1 mov ecx,txt1 mov edx,24 int 80h
call input_value call Reconstruction
push eax ;-------------------------------------------- mov eax,4 mov ebx,1 mov ecx,txt2 mov edx,25 int 80h
call input_value call Reconstruction
pop ebx add eax,ebx
call output_value
mov eax,1 int 80h ;------------------------------------------- input_value: mov eax,3 mov ebx,0 mov ecx,buffer1 mov edx,20 int 80h
mov ebx,buffer1 mov ecx,eax sub ecx,1 metka: cmp byte[ebx],'0' jl error cmp byte[ebx],'9' jg error loop metka
jmp label1
error: mov eax,4 mov ebx,1 mov ecx,txt mov edx,25 int 80h
mov eax,1 int 80h
label1: mov dword[length],eax
ret
;------------------------------------------- Reconstruction: ;процедура должна выполнять сборку из введенных значений в единое ;число, после чего в основном тексте должно быть произведено сложение. mov ecx,dword[length] ;заношу значение длины введенного буфера в регистр ecx mov ebx,buffer1 ;помещаю в регистр ebx сам буфер, чтоб из него брать символы mov eax,0 ;обнуляю eax metka2: mov al,byte[ebx+1] ;беру из буфера первый байт sub al,48 ;преобразую из аски-кода в "нормальное" число mov byte[next_symbol],al ;заношу в переменную значение полученного числа mul dword[const] ;умножаю eax на 10 add eax,dword[next_symbol] ;добавляю к eax переменную с последующим числом loop metka2 ;создаю цикл ret ;------------------------------------------- output_value: mov esi,10 mov ecx,0 pov: mov edx,0 div esi add dl,'0' push edx inc ecx cmp eax,0 jne pov mov [cnt],ecx izv: pop edx mov [digit],dl mov eax,4 mov ebx,1 mov ecx,digit mov edx,1 int 80h dec dword[cnt] cmp dword[cnt],0 jne izv
ret
;------------------------------------------ SEGMENT .data txt db '...Incorrected value...',13,10 txt1 db 'Enter the first value:',13,10 txt2 db 'Enter the second value:',13,10 koeff dd 10 summ dd 0 length dd 0 ;const equ 10 buffer1 TIMES 20 db 0 buffer2 TIMES 20 db 0 buffer3 TIMES 20 db 0 digit db 0 cnt dd 0 next_symbol dd 0 last_symbol dd 0 const db 10 value dd 0
|