Проблема в том, что в выражении 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
.