tasm работа с массивами

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by nuxster, 29 Sep 2012.

  1. nuxster

    nuxster New Member

    Joined:
    12 Jan 2011
    Messages:
    58
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток, уважаемые!
    Пытаюсь освоить assembler, знакомый гуру посоветовал начать с tasm.
    Хочу понять такую простую вещ, в языках высокого уровня, как массив. Я так понимаю в ассемблере вообще нет такого понятия массив? Но в различной литератури я все же встречаю его. Покажите пожалуйста на примерах как с ними работать, к примеру такие классические случаи как нахождение максимального элемента в двух массивах, вычитание из элементов массива, ввод данных в массив и удаление их.
    Буду очень благодарен!
     
  2. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    да, в ассемблере нету как такового понятия массива. есть некий участок памяти, не более. все что нужно для работы с ним - знать адрес этого участка памяти, количество элементов которые там размещены, или будут размещены и размерность этих элементов.

    допустим адрес нашего массива(его первого элемента) равен 1. мы знаем, что у нас в массиве 10 элементов типа DWORD. таким образом наш массив будет иметь размерность 10 * sizeof(DWORD) байтов.

    как с этим работать. берешь адрес первого элемента массива(обозначим его как A). делаешь цикл от 0 до количества элементов массива. и на каждой итерации увеличиваешь А на sizeof(тип) получая таким образом адрес следующей ячейки памяти где находится(или будет находиться если ты записываешь в массив) следующий элемент.

    надеюсь, доступно объяснил. и да, тасм - плохой выбор. он мертв. бери fasm или masm.
     
  3. nuxster

    nuxster New Member

    Joined:
    12 Jan 2011
    Messages:
    58
    Likes Received:
    0
    Reputations:
    0
    Объяснили очень понятно, но было бы не плохо увидеть как это выглядит в коде.
    Я понимаю, что он мертв но вроде как на нем учатся в институтах ))) Я бы для начала хотел бы понять общий принцип, а потом уже определиться какой именно выбрать, я думал попробовать nasm или gas они вроде как крос платформенные и nasm поддерживает inetl' овский синтаксис да и gas вроде как при наличии в коде соответствующей директивы.
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    как пример:
    сумма элементов массива
    Code:
    .model small
    .stack 100h
    .data
    mas   dw 0,1,2,3,4,5,6,7,8,9
    .code
    
    start:
    
    mov ax, @data
    mov ds, ax
    
    mov cx,10
    xor ax,ax
    xor si,si
    
    sum:
    add ax,mas[si]
    add si,2
    loop sum
    
    mov ax,4c00h
    int 21h
    
    end  start
     
  5. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    lodsw, ****!
     
  6. nuxster

    nuxster New Member

    Joined:
    12 Jan 2011
    Messages:
    58
    Likes Received:
    0
    Reputations:
    0
    Большое спасибо!

    Подскажите пожалуйста, я так понима, что это обозначает
    Code:
    .stack 100h
    стек размером в 256 байт? Я иногда встречаю запись .stack 256, в чем различия?

    Не совсем понятно данное действия:
    Code:
    add ax,mas[si]
    Что означает mas[si]?

    Вообще было бы не плохо если бы вы рассказали как работает вот эта часть кода:
    Code:
    add ax,mas[si]
    add si,2
    loop sum
     
    #6 nuxster, 1 Oct 2012
    Last edited: 1 Oct 2012
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    разница в том что 100h=256 то есть нет разницы=)
    смысл прост:берем 1-й элемент по определенному адресу с к нему в цикле cx раз добавляем второй,третий и т.д.
     
  8. nuxster

    nuxster New Member

    Joined:
    12 Jan 2011
    Messages:
    58
    Likes Received:
    0
    Reputations:
    0
    Большое спасибо!
    Еще вопрос: как в такой массив можно вводить данные с клавиатуры?
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    например функция 01h прерывание int 21h.
    а вообще есть несколько прерываний для ввода данных,подробнее погугли.