Page 36 of 77

Posted: Sun Jul 15, 2012 9:47 pm
by punk_joker
Ктонить подскажет поповоду массивов в fasm?

Re:

Posted: Sun Jul 15, 2012 10:14 pm
by Rock_maniak_forever
punk_joker wrote:Ктонить подскажет поповоду массивов в fasm?
Не знаю, что конкретно тебе надо узнать, по поводу массивов, но думаю, следует сначало, почитать :arrow: вот это (там всё доступно описано).

Posted: Sun Jul 15, 2012 10:35 pm
by punk_joker
В том то и дело, я по этим статьям и изучаю фасм. Но всеже, ток что на меня снизошло понимание этого вопроса :) . Смещение равно размеру элементов, т.е если это массив из 16-битных цифр, для доступа к каждому следующему элементу необходимо выполнить смещение на 2 байта

Re: Помогите новичку

Posted: Sun Jul 15, 2012 10:46 pm
by Rock_maniak_forever
Ну вообщем, да.

Вот формула доступа к элементу массива:
Адрес элемента = базовый адрес + (смещение * размер элемента)

Posted: Sun Jul 15, 2012 10:58 pm
by punk_joker
Имеется массив с 16-битными безнаковыми числами

array dw 1, 2, 3, 4, 5

Мне необходимо поместить скажем в регист ax, 3й элемент массива. Делаю так:

mov ax, [array+6]

Правильно понял?

Re: Помогите новичку

Posted: Sun Jul 15, 2012 11:38 pm
by Rock_maniak_forever
Да, но можно и так:

mov ax,word [array+2*3]

2 - размер элемента (2 байта).
3 - третий элемент, в твоём массиве.

Re: Помогите новичку

Posted: Mon Jul 16, 2012 12:54 am
by Rock_maniak_forever
А ещё, можно так:

Code: Select all

virtual at ARRAY
end virtual

ARRAY:
.e0: dw 1
.e1: dw 2
.e2: dw 3
.e3: dw 4
.e4: dw 5

mov ax,word [ARRAY.e3]

Re: Помогите новичку

Posted: Mon Jul 16, 2012 11:01 am
by IgorA
punk_joker wrote:Мне необходимо поместить скажем в регист ax, 3й элемент массива. Делаю так:mov ax, [array+6]Правильно понял?
Если нужен действительно 3-й элемент, то прибавлять нужно не 6 а 4. Потому что для получения 1-го элемента ничего прибавлять не нужно. Для второго нужно прибавить 2, а для третьего 4.

Re: Помогите новичку

Posted: Mon Jul 16, 2012 3:08 pm
by Nable
> Потому что для получения 1-го элемента ничего прибавлять не нужно
Паскалист, не смущай людей. Элементы массива с 0 считаются.

Posted: Mon Jul 16, 2012 5:54 pm
by punk_joker
Если я брошу решение небольшой задачки под DOS, сможет кто-то ее проверить?

Re: Помогите новичку

Posted: Tue Jul 17, 2012 4:37 pm
by Nable
Кидай. А почему именно под DOS и почему сам не проверишь?

Re: Помогите новичку

Posted: Wed Jul 18, 2012 10:25 am
by punk_joker
Я изучаю FASM по урокамм с asmworld.ru, они под дос, мол учить под него легче. Ну я в общем и не против, т.й. учить реально не само тяжело. А задание сделал, вроде все верно, но прогоняю через дебаггер, чет не то. Вот и решил, мож кто опытней проверит, и подскажет че неправильно.

Re: Помогите новичку

Posted: Wed Jul 18, 2012 11:53 am
by IgorA
изменил код примерно так:

Code: Select all

use16
org 100h

movzx cx, [n]
mov di, 0
movzx si, [n]
dec si
shl si, 2
raznost:
  mov bx, [array2+si]
  sub bx, [array1+di]
  mov [array3+si], bx
  add di, 2
  sub si, 2
  loop raznost

mov ax, 4C00h
int 21h

n db 5
array1 dw 2, -3, 5, -9, 6
array2 dw 7, 9, -2, -4, 1
array3 dw 5 dup(?) 
рекомендации:
- старайся не изменять первоначальные данные, лучше изменять значения регистров если есть возможность
- умножение на числа кратные 2 лучше заменять на разрядный сдвиг
- результат у тебя попадал в array2 а не в array3

Posted: Wed Jul 18, 2012 12:03 pm
by punk_joker
С занесением результата в массив реально перепутал. А зм советы спасибо. Вычисляет все правильно?

Re: Помогите новичку

Posted: Thu Jul 19, 2012 2:00 pm
by Rock_maniak_forever
А можно и так (у меня прога получилась на 13 байт короче):

Code: Select all

use16
org 100h

movzx cx, byte [n]
xor   di, di
mov   si, cx
dec   si
shl   si, 1
raznost:
  mov  bx, word [array2+si]
  mov  dx, word [array1+di]
  sub  bx, dx
  mov  [array3+si], word bx
  add  di, s
  sub  si, s
  loop raznost

int 20h

s  = 2
n db 5
array1 dw 2, -3, 5, -9, 6
array2 dw 7, 9, -2, -4, 1
array3 dw 5 dup(?)
Вместо mov di, 0, лучше делать xor di, di.
А умножать на 2, надо так - shl si, 1.
Вместо s db 2, лучше делать s = 2.