Схема Горнера
Добавлено: 20 май 2007, 10:45
Пишу прогу в Линуксе. Задание - ввести два числовых значения, сложить их и вывести. Обязательно использовать процедуру преобразования числа по схеме Горнера. Прокомментировал процедуру 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
Помогите разобраться!
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