Сборка x86, перемещение данных из массива в реестр -- pointers поле с участием assembly поле с участием x86 пол Связанный проблема

x86 assembly, moving data from an array to a register


0
vote

проблема

русский

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

Это встроенная сборка в Visual Studio.

 <код> ThreadAbortException0  

Эта последняя строка, я пытаюсь сохранить 4 байтовое значение, которое находится в массиве. Но я получаю Ошибка C2415: Неправильный тип операнда

Что я делаю не так? Как копировать 4 байтовое значение из массива в 32-битный регистр?

Английский оригинал

Ive been going over the book over and over again and cannot understand why this is giving me "improper operand type". It should work!

This is inline assembly in Visual Studio.

function(unsigned int* a){ unsigned int num;  _asm {  mov eax, a //This stores address (start of the array) in eax mov num, dword ptr [eax*4] //This is the line I am having issues with. 

That last line, I am trying to store the 4 byte value that is in the array. But I get error C2415: improper operand type

What am I doing wrong? How do I copy 4 byte value from an array into a 32 bit register?

</div
        
       
       

Список ответов

2
 
vote

в встроенной сборке Visual C ++, все переменные доступны в виде операндов памяти 1 ; Другими словами, везде, где вы пишете <код> Private Sub Example(byval ph as Placeholder, **byref method as delagate**) for each ctrl as control in ph.controls if typeof (ctrl) is textbox then dim cb as checkbox = ctrl AddHandler cb.DataBinding, **method** end if next end sub 0 Вы можете подумать, что компилятор заменит <код> Private Sub Example(byval ph as Placeholder, **byref method as delagate**) for each ctrl as control in ph.controls if typeof (ctrl) is textbox then dim cb as checkbox = ctrl AddHandler cb.DataBinding, **method** end if next end sub 1 .

Теперь это означает, что в последнем <код> Private Sub Example(byval ph as Placeholder, **byref method as delagate**) for each ctrl as control in ph.controls if typeof (ctrl) is textbox then dim cb as checkbox = ctrl AddHandler cb.DataBinding, **method** end if next end sub 2 вы эффективно пытаетесь выполнить память памяти памяти Private Sub Example(byval ph as Placeholder, **byref method as delagate**) for each ctrl as control in ph.controls if typeof (ctrl) is textbox then dim cb as checkbox = ctrl AddHandler cb.DataBinding, **method** end if next end sub 3 , который не предусмотрен на X86. Вместо этого используйте временный регистр:

 <код> Private Sub Example(byval ph as Placeholder, **byref method as delagate**)   for each ctrl as control in ph.controls     if typeof (ctrl) is textbox then       dim cb as checkbox = ctrl       AddHandler cb.DataBinding, **method**     end if   next end sub 4  

Обратите внимание, что я удалил * 4, так как на самом деле не имеет смысла умножить указатель к четырем - возможно, вы должны использовать Private Sub Example(byval ph as Placeholder, **byref method as delagate**) for each ctrl as control in ph.controls if typeof (ctrl) is textbox then dim cb as checkbox = ctrl AddHandler cb.DataBinding, **method** end if next end sub 5 в качестве базы плюс Другой индекс?


1 Другие компиляторы, такие как gcc, предоставляют средства для контроля более тонко взаимодействия между встроенным монтажом и сгенерированным компилятором, который обеспечивает большую гибкость и мощность, но имеет довольно крутущую кривую обучения и требует довольно крутой кривой обучения большая забота, чтобы получить все правильно.

 

In Visual C++'s inline assembly, all variables are accessed as memory operands1; in other words, wherever you write num you can think that the compiler will replace dword ptr[ebp - something].

Now, this means that in the last mov you are effectively trying to perform a memory-memory mov, which isn't provided on x86. Use a temporary register instead:

mov eax, dword ptr [a]     ; load value of 'a' (which is an address) in eax mov eax, dword ptr [eax]   ; dereference address, and load contents in eax mov dword ptr [num], eax   ; store value in 'num' 

Notice that I removed the *4, as it doesn't really make sense to multiply a pointer by four - maybe you meant to use a as base plus some other index?


1 Other compilers, such as gcc, provide means to control way more finely the interaction between inline assembly and compiler generated code, which provides great flexibility and power but has quite a steep learning curve and requires great care to get everything right.

</div
 
 
         
         

Связанный проблема

1  Копирование объекта для временного использования из цели параметра постоянного указателя  ( Copying an object for temporary use from the target of a constant pointer parame ) 
Я ищу копирование объекта, указанного на указатель-к-Const (в качестве аргумента) в функции для временного, выделенного стеком, выделенной на выделенную стеко...

0  Доступ к участнику через указатель на объект  ( Member access through pointer to object ) 
На стеке компилятор свободен делать много оптимизаций, потому что контекст статичен и известен во время компиляции, но при работе с доступом к динамически выд...

2  Как использовать Float ** от C в Python?  ( How to use float from c in python ) 
После отсутствия успеха с моим вопросом на Как использовать float * * В Python с Swig? , я начал думать, что Swig может не быть оружием выбора. Мне нужны при...

1  Как добавить нулевые символы в строки?  ( How to add null characters to strings ) 
Так что я пытаюсь ослабить строку без Strtok для домашнего задания. Профессор рекомендовал добавить « 0», где есть пробел, чтобы сломать строку в такие части,...

0  Связанные значения списка изменены, когда я хочу распечатать его  ( Linked list values changed when i want to print it ) 
Я хочу распечатать мой вдвойне связанный список. Вот функция <код> void show(que *q) { que *temp; temp = q; if (q->cnt == 0) printf (" ...

9  Различия между массивами, указателями и строками в C  ( Differences between arrays pointers and strings in c ) 
Просто имейте в виду вопрос, который беспокоит меня. Я знаю <код> pointers и <код> arrays различается в c, потому что <код> pointers хранить <код> addres...

1  Как завершить функцию, чтобы использовать арифметику указателя вместо массива подписки в C?  ( How to complete function to use pointer arithmetic instead of array subscripting ) 
Я борюсь со специфическими частями в моем коде, что я, кажется, отформатировал неправильно. Этот код был взят из моей книги программирования и детали, которые...

5  Возвращая указатель на местную структуру  ( Returning pointer to a local structure ) 
Безопасно, чтобы вернуть указатель на локальную структуру в C? Я имею в виду это делать <код> struct myStruct* GetStruct() { struct myStruct *str =...

199  Как адрес массива равен его ценности в C?  ( How come an arrays address is equal to its value in c ) 
В следующем бите кода значения указателя и адреса указателя отличаются, как ожидалось. Но значения массива и адреса не! Как это может быть? Выход <код...

7  Цель C: Как работает 7 - 1 = 3?  ( Objective c how does 7 1 3 ) 
<код> NSLog(@"Before: %d",currentArticle); currentArticle--; NSLog(@"SUBTRACT %d",currentArticle); "CurrentAryicle" - это целое число. Это только один раз...

2  Функция подпись указывает на возвратный тип void *, но возвращает указатель другого типа  ( Function signature indicates return type void but returns pointer of a differe ) 
Я путаю в следующем коде, с функцией подпись, указывающая функцию, возвращает пустотный указатель. Тип фактически возвращен, однако, является BlockInfo *. Фун...

-1  C ++ правильный способ инициализации и обработки указателя на карту  ( C correct way to initialize and handle pointer to map ) 
Позвольте сказать, что я хочу частного указателя на карту в моем классе. И я хочу, чтобы это было указывать на NULL, если аргумент моего конструктора (логичес...

0  Ручки и указатель на объект  ( Handles and pointer to object ) 
У меня есть интерпретатор Python, написанный на C ++, функция Pyrun_String из API Python, чтобы вернуть ручку, однако в моем коде у меня есть присвоение указа...

-1  Мусор с указателями в классе, C ++  ( Garbage with pointers in a class c ) 
Я использую Borland Builder C ++. У меня есть утечка памяти, и я знаю, что это должно быть из-за этого класса, который я создал, но я не уверен, как это испра...

1  Печать пустового указателя в связанном списке  ( Print void pointer in a linked list ) 
У меня есть массив структуров, называемых ArrayOfElements, структуры называются элементами, которые имеют пустотный указатель <код> typedef struct { voi...

Связанный проблема

1  Копирование объекта для временного использования из цели параметра постоянного указателя 
0  Доступ к участнику через указатель на объект 
2  Как использовать Float ** от C в Python? 
1  Как добавить нулевые символы в строки? 
0  Связанные значения списка изменены, когда я хочу распечатать его 
9  Различия между массивами, указателями и строками в C 
1  Как завершить функцию, чтобы использовать арифметику указателя вместо массива подписки в C? 
5  Возвращая указатель на местную структуру 
199  Как адрес массива равен его ценности в C? 
7  Цель C: Как работает 7 - 1 = 3? 
2  Функция подпись указывает на возвратный тип void *, но возвращает указатель другого типа 
-1  C ++ правильный способ инициализации и обработки указателя на карту 
0  Ручки и указатель на объект 
-1  Мусор с указателями в классе, C ++ 
1  Печать пустового указателя в связанном списке 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.