I am working on a program in C + x86 assembly (NASM) which performs rotating and scaling of an image. In order to do that it goes through pixels of the destination image one by one and calculates the corresponding pixel in the source image.
That part of the assembly code:
; buffer operations
push ebx
fistp dword loc ; store the number of src pixel
mov dword ebx, loc ; move it to ebx
imul ebx, 3 ; 3 bytes per pixel, so multiply pixel number by 3
mov dword eax, [ebx+esi]; store that pixel's color bytes ; ERROR, SEGSEV
mov dword [edi], eax ; draw a pixel
pop ebx
particularly the line marked 'ERROR, SEGSEV' generates a segmentation fault. I reckon that is due to the fact that I'm trying to access the unaligned memory address. That said, the bmp file pixel buffer is organised in a way that each pixel has B, G, R bytes stored one after another, so 3 bytes per pixel and each pixel's first byte can have a position in memory that is not divisible by 4 (eg: pixel one: 0.B, 1.G, 2.R; pixel two: 3.B, 4.G, 5.R - so I must access the address 3 to get to the second pixel).
The question is: how then can I access pixel's data if I'm not allowed to access unaligned memory location and how is it usually done when working with bmp files?
dwordin front of a register since the size of a register is always known.mov ebx, locis going to move the address oflocto EBX. Is that what you want or do you want the value atlocand something likemov ebx, [loc]? If you step through with a debugger (ie: gdb) you should find out exactly why this is failing.movcan access aligned data fine, it may just incur a performance penalty depending on architecture. - Michael Petchmovcan access aligned data fine" should have been UNALIGNED - Michael Petch