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

Applications development, KoOS API questions
  • punk_joker wrote:Ктонить подскажет поповоду массивов в fasm?
    Не знаю, что конкретно тебе надо узнать, по поводу массивов, но думаю, следует сначало, почитать :arrow: вот это (там всё доступно описано).
  • В том то и дело, я по этим статьям и изучаю фасм. Но всеже, ток что на меня снизошло понимание этого вопроса :) . Смещение равно размеру элементов, т.е если это массив из 16-битных цифр, для доступа к каждому следующему элементу необходимо выполнить смещение на 2 байта
    to infinity and beyond
  • Ну вообщем, да.

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

    array dw 1, 2, 3, 4, 5

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

    mov ax, [array+6]

    Правильно понял?
    to infinity and beyond
  • Да, но можно и так:

    mov ax,word [array+2*3]

    2 - размер элемента (2 байта).
    3 - третий элемент, в твоём массиве.
    Last edited by Rock_maniak_forever on Mon Jul 16, 2012 12:58 am, edited 1 time in total.
  • А ещё, можно так:

    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]
    
  • punk_joker wrote:Мне необходимо поместить скажем в регист ax, 3й элемент массива. Делаю так:mov ax, [array+6]Правильно понял?
    Если нужен действительно 3-й элемент, то прибавлять нужно не 6 а 4. Потому что для получения 1-го элемента ничего прибавлять не нужно. Для второго нужно прибавить 2, а для третьего 4.
  • > Потому что для получения 1-го элемента ничего прибавлять не нужно
    Паскалист, не смущай людей. Элементы массива с 0 считаются.
  • Если я брошу решение небольшой задачки под DOS, сможет кто-то ее проверить?
    to infinity and beyond
  • Кидай. А почему именно под DOS и почему сам не проверишь?
  • Я изучаю FASM по урокамм с asmworld.ru, они под дос, мол учить под него легче. Ну я в общем и не против, т.й. учить реально не само тяжело. А задание сделал, вроде все верно, но прогоняю через дебаггер, чет не то. Вот и решил, мож кто опытней проверит, и подскажет че неправильно.
    Attachments
    Task.zip (598 Bytes)
    Задание и решение в архиве
    Downloaded 416 times
    to infinity and beyond
  • изменил код примерно так:

    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
  • С занесением результата в массив реально перепутал. А зм советы спасибо. Вычисляет все правильно?
    to infinity and beyond
  • А можно и так (у меня прога получилась на 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.
  • Who is online

    Users browsing this forum: No registered users and 12 guests