доступ к элементу массива на ассемблере (windows) - PullRequest
4 голосов
/ 19 мая 2010

У меня проблема в ассемблере, что я получил доступ к элементу массива ... предположим, что массив содержит день недели ... как sun, mon, tues, wed .... мне нужен доступ ко 2-му индексу массива ... Как я могу это сделать?

1 Ответ

12 голосов
/ 19 мая 2010

Индексирование в сборке в основном такое же, как в C / C ++, за исключением одного различия: вы должны знать размер ваших элементов данных.

Например, чтобы просмотреть массив байтов (или символов в строке) в сборке, вы можете сделать следующее:

mov eax, 0
mov ecx, 0

loop_start:
  cmp ecx, ARRAY_LENGTH
  jge loop_end

  add eax, BYTE PTR myArray[ecx]

  add ecx, 1
  jmp loop_start
loop_end:

Как видите, массив проходит по одному элементу за раз, увеличивая ecx (который я использую в качестве счетчика). Каждый элемент добавляется в eax, который содержит сумму в конце цикла. Обратите внимание, что мне пришлось добавить «BYTE PTR» при обращении к массиву, чтобы сообщить ассемблеру, какой тип данных я использую.

Теперь взгляните на этот код, который делает то же самое для данных DWORD (4 байта):

mov eax, 0
mov ecx, 0

loop_start:
  cmp ecx, ARRAY_LENGTH
  jge loop_end

  add eax, myArray[ecx*4]

  add ecx, 1
  jmp loop_start
loop_end:

Изменились только две вещи: мне больше не нужно было использовать «BYTE PTR», потому что, если не указано иное, ассемблер предполагает, что вы используете 32-битные типы данных на 32-битной машине; Мне также нужно было изменить индекс массива на «ecx * 4», потому что каждый элемент в массиве имеет длину 4 байта. Большинство типов данных, используемых на 32-разрядных компьютерах, имеют размер 32 бита, поэтому более поздний пример будет более распространенным.

Чтобы ответить на ваш конкретный вопрос, вот один из способов перебрать массив строк и отобразить их:

.data
  sunday    db "Sun",0
  monday    db "Mon",0
  tuesday   db "Tues",0
  wednesday db "Wed",0
  thursday  db "Thurs",0
  friday    db "Fri",0
  saturday  db "Sat",0

  daysOfWeek dd OFFSET sunday, OFFSET monday, OFFSET tuesday OFFSET wednesday
             dd OFFSET thursday, OFFSET friday, OFFSET saturday

.code
mov ecx, 0

loop_start:
  cmp ecx, 7
  jge loop_end

  mov eax, daysOfWeek[ecx*4]
  ; eax now contains the pointer to the
  ; next element in the array of days

  add ecx, 1
  jmp loop_start
loop_end:

Поскольку указатели на 32-разрядном компьютере имеют ширину 32 бита, обрабатывайте их как DWORD, как во втором примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...