JMP к абсолютному адресу (коды операции)

Извинения за короткий ответ, но не, спецификация языка C# запрещает его.

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

Hope это помогает

РЕДАКТИРОВАНИЕ: Вы спрашиваете Почему?

Вы передаете переменную out или ref параметр, Вы на самом деле передаете адрес (или местоположение в памяти) переменной. В функции компилятор знает, где переменная действительно, и получает и пишет значения в тот адрес.

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

Thats совершенно другая вещь передать функции, чем адрес переменной

т.е. один переменный v's адреса два указателя функции.

Обновление
, Почему не делает C# просто, заботится об этом для нас?

я не Eric Lippert , но я буду делать попытку того, почему

, Что должно подпись функции, которую Вы вызываете быть?
Позволяет, говорят, что Вы хотите звонить void MyFn(ref int i), который должен остаться тем путем, или он должен измениться, чтобы сказать, что мы также позволяем свойства? Если это изменяется на некоторый синтаксис как void MyFn(prop_ref int i) затем, это довольно бесполезно, Вы не можете передать свойства библиотечным функциям или стороннему коду, который не был написан со специальным prop_ref модификатором. Так или иначе я думаю, что Вы предлагаете, чтобы это не должно было отличаться.

Теперь позволяет, говорят MyFn передачи i к функции COM или вызову WinAPI, передавая адрес i (т.е. за пределами .NET, касательно). Если это - свойство, как Вы получаете адрес i? Не может быть никакого фактического интервала под свойством для получения адреса. Вы делаете то, что делает VB.Net?

Vb. Сетевой компилятор определяет, когда свойство передается как аргумент ByRef методу. В той точке это объявляет переменную, копирует свойство в переменную, передает переменную byref и затем после того, как метод называют, копирует переменную назад в свойство. т.е.

MyFunc(myObject.IntProperty)

становится

Dim temp_i As Integer = myObject.IntProperty
MyFunc(temp_i)
myObject.IntProperty = temp_i

, Любых побочных эффектов свойства не происходит до MyFunc возвраты, которые могут вызвать все виды проблем и привести к [1 116] очень тонкие ошибки.

По моему скромному мнению Vb. Сетевое решение этой проблемы также повреждается, таким образом, я не собираюсь признавать что как ответ.

, Как Вы думаете, компилятор C# должен обработать это?

6
задан Qix 10 July 2015 в 04:00
поделиться

2 ответа

I think that E9 is an opcode for a relative jump: its operand specifies a relative distance to be jumped, plus or minus from the start of the next instruction.

If you want the operand to specify an absolute address, you would need a different opcode.

6
ответ дан 8 December 2019 в 03:39
поделиться

Вы можете использовать:

push DESTINATION_VA
ret

или

mov eax,DESTINATION_VA
jmp eax

относительную кодировку E9 JMP используются следующим образом:

CURRENT_RVA: jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])

push + RET - лучшее решение, если у вас есть адрес VA, а изображение не перемещено

17
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: