Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2008, 20:58   #1
fatdog
Новичок
Джуниор
 
Регистрация: 20.02.2008
Сообщений: 2
По умолчанию одномерный массив

Люди те кто шарят плз помогите не могу разобраться где ошибка..
Цель программы следующая, сформировать одномерный массив A={ai} (i=1...30), где ai вычисляется по формулам: ai= (i+75)/100 + (i/2+ i/3) 0<i<31..
Вот что у меня получилось
----------------------------------------------------------------
MASM
Код:
MODEL small
.data
mes db 0ah,0dh, 'Њ*ббЁў- ','$'
mas db 30 dup(?)
i db 1
s75 db 75
s100 db 100    
sum db (?)
.code
main:
mov ax,@data
mov ds,ax
xor ax,ax
mov cx,30
mov si,0
go:
xor ax,ax
mov al,i
add ax,s75
div 100
mov sum
mov ax,si
div 2
mov dl,al
xor ax,ax
mov al,i
div 3
mov ah,0h
add dl
add sum
mov mas[si],ax
inc i
inc si
inc si
loop go
;ўлў®¤
mov cx,30
mov si,0
mov ah,09h
lea dx,mes
int 21h
show:	
mov ah,02h
mov dl,mas[si]
add dl,30h
int 21h
inc si
loop show
exit:
mov ax,4c00h
int 21h
end main
Пишет начинаются с метки go... плз кто разбирается помогите разобраться

Последний раз редактировалось rpy3uH; 21.02.2008 в 19:41.
fatdog вне форума Ответить с цитированием
Старый 21.02.2008, 09:09   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Путаница с индексами:

Во первых не совпадает количество элементов массива (1..30) и количество значений по формуле (0..31)

во вторых - по тексту программы:

i - индекс внутри массива (1..30)
si - индекс внутри формулы (наверное 0..29)

тогда
mov al,i <---- неправильно - нужно mov ax, si
add ax,s75
div 100

то-же с делением на 3

обращение к элементам массива через i, а не через si

почему si - инкремент два раза ?

Вывод. Внимательнее с индексами. А ошибка уже в постановке задачи.
alexBlack вне форума Ответить с цитированием
Старый 21.02.2008, 11:14   #3
fatdog
Новичок
Джуниор
 
Регистрация: 20.02.2008
Сообщений: 2
По умолчанию

количество элементов нормально... у меня в массиве 30 элементов по условию задачи надо от 0 до 31 не включительно...
а с индексами попробывал поменять место mov al,i на mov al,si и аналогично при делении на 3 ... всеравно при компиляции ошибки начиная со строки
Mov al,si
add ax,s75
До строки
mov mas[si],ax

а про инкрементацию si спс не заметил что написал 2 раза ))

Последний раз редактировалось fatdog; 21.02.2008 в 11:35. Причина: очепятка
fatdog вне форума Ответить с цитированием
Старый 21.02.2008, 11:44   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от fatdog Посмотреть сообщение
а с индексами попробывал поменять место mov al,i на mov al,si
еще раз повторю: внимательнее si - 16-битовый. Нужно mox ax. si

Насчет диапазона в условии извиняюсь. Сбило с толку использование двух переменных.
В цикле используется переменная i и регистр SI. Только инициализация для i с 1-цы, для SI - с нуля.

Последний раз редактировалось alexBlack; 21.02.2008 в 12:23.
alexBlack вне форума Ответить с цитированием
Старый 23.02.2008, 10:05   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

У нас будут использоваться целочисленные операции, поэтому, чтобы
хоть как-то уменьшить погрешности округления, после несложных преобразований
приведем формулу к виду:

(253*i+225)/300


Перед решением всегда полезно знать ответ, поэтому просчитаем формулу
в Excell. получим последовательность:

1 2 3 4 4 5 ... 25 26

теперь код:

Код:

MODEL small
.data
mes  db 'result: ', 0Dh, 0Ah, '$'
mas  db 30 dup(?)   
sum  dw (?)   

.code   
main:   
      mov ax, @data   
      mov ds, ax   
      mov cx, 30  
      mov si, 1  
  go:   
      mov ax, si   
      mov bx, 253
      mul bx
      add ax, 225
      adc dx, 0
      mov bx, 300
      div bx 
      
      mov mas[si], al
      inc si   
      loop go   

      mov ah, 09h   
      lea dx, mes   
      int 21h   

      mov si, 1
      mov cx, 30
 show:  
      ; число максимум 2-х значное
      xor ax, ax
      mov al, mas[si]   
      mov bl, 10
      div bl

      ; выводим десятки
      push ax
      mov ah, 02h   
      mov dl, al   
      add dl, 30h   
      int 21h
      pop ax
      xchg ah, al

      ; выводим остаток от деления на  10
      mov ah, 02h   
      mov dl, al   
      add dl, 30h   
      int 21h

      ; пробел между числами  
      mov ah, 02h   
      mov dl, 20h
      int 21h

      inc si   
      loop show   

 exit:
      mov ax, 4c00h   
      int 21h   

end main
Компилируем, проверяем результат:

result:
01 02 03 04 04 05 06 07 08 09 10 10 11 12 13 14 15 15 16 17 18 19 20 20 21 22 23 24 25 26
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одномерный массив ldx Паскаль, Turbo Pascal, PascalABC.NET 4 06.06.2008 17:45
VBA. Одномерный массив ExMatiss Microsoft Office Excel 9 07.05.2008 05:57
безразмерный одномерный массив SunKnight Общие вопросы C/C++ 1 20.02.2008 04:13
Массив Одномерный flait111 Помощь студентам 3 15.12.2007 14:08
Одномерный массив SkyDreamer Помощь студентам 1 01.12.2007 21:22