NASM MOV根据地点产生段错误

时间:2014-02-10 16:28:16

标签: debugging assembly segmentation-fault nasm

我正在制作一个小NASM功能,使像素表的垂直镜像存储在一维字节向量中,颜色排列如BGRBGRBGR ...

我做了一个原型,它首先(最后,它是BMP)线。现在我有一个问题,为什么这个版本是正确的,而不是生成SEGFAULT:

global asm_vert

section     .text

asm_vert:   
            push ebp
            mov ebp, esp
            push ecx
            push esi
            push ebx
            push edx
            push edi

            mov edx, [ebp+8]        ; table width
            mov ecx, [ebp+12]       ; table height
            mov esi, [ebp+16]       ; input table adress
            mov edi, [ebp+20]       ; output table adress

            mov eax, edx
            mov ecx, edx
            mov ebx, 3
            mul ebx
            add edi, eax
            sub edi, 3

x_loop:
            mov bl, byte[esi]
            mov byte[edi], bl
            inc esi
            inc edi
            mov bl, byte[esi]
            mov byte[edi], bl
            inc esi
            inc edi
            mov bl, byte[esi]
            mov byte[edi], bl
            inc esi
            sub edi, 5
            loop x_loop

            pop edi
            pop edx
            pop ebx
            pop esi
            pop ecx
            pop ebp

            ret

如果我只编辑该部分:

            mov eax, edx
            mov ecx, edx
            mov ebx, 3
            mul ebx
            add edi, eax
            sub edi, 3

对此:

            mov eax, edx
            mov ebx, 3
            mul ebx
            mov ecx, edx
            add edi, eax
            sub edi, 3

无效。我认为这在逻辑上是一样的,但如果第一个版本是正确的而第二个版本不是正确的则不是。你会推荐哪个带图形界面的调试器(Linux)?

我会感谢任何建议。

1 个答案:

答案 0 :(得分:0)

MUL EBX将产品存储在EDX:EAX中,因此当您在MOV ECX,EDXMUL放置ECX产品的高32位时而不是宽度。