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?
Не знаю, что конкретно тебе надо узнать, по поводу массивов, но думаю, следует сначало, почитать
вот это (там всё доступно описано).
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.