Как записать целое число в массив, переданный с INVOKE? - PullRequest
0 голосов
/ 10 мая 2018

Я не могу разобраться с этой простой проблемой, которая включает запись целых чисел в массив.Как вы можете видеть из кода ниже, я передаю адреса в процедуру и пытаюсь записать в массив.Я пытался получить доступ к массиву разными способами, но, похоже, доступ к адресам в процедуре не работает так же, как в MAIN.Я не могу представить, почему freqTable был бы недоступен в функции get_freq.Пожалуйста, просветите меня.

.data
target BYTE "aaaa",0
freqTable DWORD 256 DUP(0)

.code
get_freq PROC,table PTR DWORD
mov table[0],'b'  <---  writing 'b' to wrong address
ret 
get_freq endp

main PROC
INVOKE get_freq,ADDR freqTable
exit 
main ENDP

1 Ответ

0 голосов
/ 10 мая 2018

Проблема в том, что в выражении mov table[0],'b' вы ссылаетесь на адрес table вместо значения table = ADDR freqTable, передаваемого в качестве параметра.Таким образом, вы должны записать в стек, содержащий переменную LOCAL table, а не в сегмент DATA, где значение таблицы указывает на (= freqTable).

Итак, чтобы эта работа работала, вы 'в качестве адреса нужно использовать значение table:

get_freq PROC table: PTR DWORD
  mov eax, table            <--- get value of table=ADDR freqTable to EAX
  mov DWORD PTR [eax], 'b'  <--- writing 'b' to address with value EAX
  ret 
get_freq endp

Если вы хотите добавить индекс к адресу, вы можете использовать

mov DWORD PTR [eax+ecx], 'b'

для этого с ECX как индексный регистр, например.В вашем случае ECX должно быть 0.

, похоже, что доступ к адресам в процедуре не работает так же, как в MAIN.

Да.Существует разница между использованием прямого адреса (глобальной переменной) и адреса, передаваемого в качестве параметра (как в PROC).Приведенный выше пример пытается проиллюстрировать это.

Глобальные переменные всегда могут быть доступны с помощью директивы OFFSET, такой как

mov eax, offset freqTable

Если вы добавите другое косвенное обращение, например, с помощью параметра, переданного в процедурувам нужно будет принять это во внимание, как

push offset freqTable       <!-- store address on stack
call get_freq               <!-- call procedure with variable on stack
...                         
mov eax, variableName       <!-- get address from stack
mov DWORD PTR [eax], 'b'    <!-- use it

Так что вторая возможность использования параметра открывает способ передачи значений времени выполнения в процедуру, что невозможно при использовании времени компиляции-значения, предлагаемые способом OFFSET.

...