2016-10-20 3 views
0

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

Я был занят работой с кодом в сборке и запуском небольшого теста, чтобы узнать, получаю ли я те же результаты. Следующий бит c-кода, который я перевожу, имеет структуры, и я не могу найти хороший, полный пример для этого.

Вот мой C код:

typedef struct item { 
    int number; 
    char name[32]; 
} item; 

/** 
* Performs a binary sort on the items pointed to by the parameter list. 
* 
* @param[in/out] list pointer to an array of items 
* @param[in]  n  total number of elements in the array 
*/ 

void binary_sort_c(item *list, int n) { 
    int i; 
    int j; 
    int bottom; 
    int top; 
    int middle; 
    item temp; 

    if (list != NULL) { 
     i = 1; 
     while (i < n) { 
      temp = list[i]; 
      bottom = 0; 
      top = i-1; 
      while (bottom <= top) { 
       middle = (bottom+top)/2; 
       if (temp.number < list[middle].number) { 
        top = middle-1; 
       } else { 
        bottom = middle+1; 
       } 
      } 
      j = i-1; 
      while (j >= bottom) { 
       list[j+1] = list[j]; 
       j = j-1; 
      } 
      list[bottom] = temp; 
      i = i+1; 
     } 
    } 
} 

Теперь здесь лежит моя проблема, я не могу показаться, чтобы выяснить, как использовать эту структуру в сборке. Должен ли я переделать структуру в сборке, если она передана в качестве аргумента для сборки с помощью кода c?

Как получить доступ к различным элементам структуры в сборке? Например, temp.number

Как проверить, есть ли в сборке list = NULL?

Небольшой примерный код, который я мог бы использовать в качестве шаблона для работы и понимания, был бы идеальным.

+0

'list' только простой аргумент указатель, так что вы проверить NULL, как обычно, по сравнению с нуля. Что касается доступа к членам, вам необходимо знать смещения. – Jester

+0

@Jester поэтому достаточно проверить 'if (list! = NULL)', 'mov eax, list',' cmp eax, 0' 'jne LABEL'? – Monkleys

+0

Да, это будет работать, в зависимости от того, как был объявлен «список». – Jester

ответ

1

Как получить доступ к различным элементам конструкции в сборке?

Вам понадобится знать точный формат памяти, который генерирует компилятор C для этой структуры (например, если и как он выравнивает элементы/элементы прокладки).

Предполагая уплотненный-структуру, вы должны быть в состоянии сделать что-то вроде:

STRUC ITEM 
.iNumber RESD 1 
.cName RESB 32 
ENDSTRUC 

; Now let's say you have an item* in ebx: 

mov dword [ebx + ITEM.iNumber],123 
+0

Как вы это делали, могу ли я принять аргументы, приведенные как парадигмы, и получить к ним доступ, используя это? Как: 'MOV EDI, список, \t MOV EAX, 1, \t Lea ЭРИ, [EDI + EAX * 4];, \t MOV EBX, [ESI], \t мов ECX, DWORD [EBX + ITEM.iNumer ] ' Будет ли это работать? @Michael – Monkleys

+0

Кроме того, будет 'STRUC ITEM, .iNumber RESD 1, .cName RESB 32, ENDSTRUC' идти до или после ' binary_sort: \t толчок EBP, \t мов EBP, ESP, ' @Michael – Monkleys

+0

Определение типа структуры может идти до или после местоположения, где вы его впервые используете, это не имеет значения. – Michael

 Смежные вопросы

  • Нет связанных вопросов^_^