29.01.2009, 23:03
общий
это ответ
Здравствуйте, Койбаев Олег Артурович!
Как верно заметил Airyashov, массив нумеруется с 0, а не с 1.
Кроме того, Вы его заполняете с 1 элемента, а выводите с нулевого, вот этот непроинициализированный элемент равный 0,
мы и видим. Это первое.
Второе. "Другие значения" - это результат целочисленного деления с отбрасыванием остатка.
Но...нужный результат можно достичь! Только для этого надо немного изменить формулу (этим мы уменьшим погрешность!)
i/5 +i/3 = (8*i)/15 = (i<<3)/15 В последнем выражении умножение на 8 я заменил на сдвиг влево на 3 бита.
Программа в приложении, реализующая эту формулу, выводит нужные числа...
Приложение:
MODEL small
STACK 256
.286
.data
mes db 0ah,0dh,'Massiv: ','$'
mas db 20 dup (?) ;исходный массив
s15 db 15
s50 db 50
.code
main:
mov ax,@data
mov ds,ax
mov cx,20 ;значение счетчика цикла в cx
xor si,si ;индекс начального элемента,одновременно i-1
go:
lea ax,[si+1] ;ax=i
shl ax,3 ;ax=8*i
div s15 ;делим 8*i/15 = i/5 + i/3
add al,s50 ;al = i/5 + i/3 + 50
mov mas[si],al ;запись в массив
inc si ;продвижение к следующему
loop go
;вывод на экран получившегося массива
mov ah,09h
lea dx,mes
int 21h
mov cx,20
mov si,offset mas
show:
lodsb
call outNumber
loop show
exit:
mov ax,4c00h ;стандартный выход
int 21h
outNumber: pusha
and ax,0ffh
;десятичная система
mov bx,10
;счетчик цифр в числе
xor cx,cx
;делим число на 10
isDiv: xor dx,dx
div bx
;запоминаем в стеке остаток от деления
push dx
;считаем количество запоминаемых символов
inc cx
;продолжаем пока АХ не равно 0
or ax,ax
jnz isDiv
;выводим из стека цифры в нужном порядке
isOutNum: pop ax
;перводим в цифру в символ
or al,30h
;выводим в режиме телетайпа
;эта функция аналогична mov ah,02 - int 21h
;только места меньше занимает
int 29h
;повторяем вывод в цикле
loop isOutNum
mov al,20h
int 29h
popa
ret
end main ;конец программы
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен