Возврат значения, на которое указывает указатель в x86 NASM - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь написать функцию в сборке NASM x86, которая получает указатель на структуру (структура содержит указатель на буфер) и 2 дюйма (x, y), которая затем вычисляет адрес байта, содержащего (x, у) и возвращает значение по этому адресу. (Буфер содержит файл bmp) У меня есть эта функция, написанная на C, и она отлично работает.

C функция

int loadByte(imgInfo* pImg, int x, int y)
{
    unsigned char *pPix = pImg->pImg + (((pImg->width + 31) >> 5) << 2) * y + (x >> 3);
    return *pPix;
}

функция x86

load_byte:
    push ebp           ; prologue
    mov ebp, esp  

    lea ecx, [ebp + 8]  
    mov ecx, [ecx]      ; ecx = &imgInfo
    mov eax, [ecx+0]    ; eax = width
    add eax, 31         ; eax = width + 31
    sar eax, 5          ; eax = (width + 31) >> 5
    sal eax, 2          ; eax = ((width + 31) >> 5) << 2
    mul DWORD [ebp+16]  ; eax * y
    mov edx, [ebp+12]   ; edx = x
    sar edx, 3          ; edx = x>>3
    add eax, edx        ; eax = ((width + 31) >> 5) << 2 * y + (x >> 3)
    mov edx, [ecx+8]    ; edx = &pImg
    add eax, edx
    mov eax, [eax]

    pop ebp            ; epilogue
    ret

Я попытался проверить, вычисляется ли адрес в обе функции одинаковы, поэтому я изменил возврат C на return pPix и прокомментировал строку mov eax, [eax] в x86, и, к моему удивлению, обе функции вернули одно и то же число, но в неизменном виде (как в коде выше) Функция x86 всегда возвращает -1 по какой-то причине. return *pPix не эквивалентен mov eax, [eax]? Что не так с моими рассуждениями?

imgInfo struct

typedef struct
{
    int width, height;
    unsigned char* pImg;    //buffer
    int cX, cY;
    int col;
} imgInfo;

load_byte C объявление

extern int load_byte(imgInfo* pInfo, int x, int y);

...