Я пытаюсь написать функцию в сборке 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);