NASM增加注册bug的价值

时间:2017-09-01 11:38:43

标签: linux assembly x86 nasm

我正在尝试将几个像素添加到一起,以便在NASM中进行模糊滤镜。我设法添加了三个像素,其值为00 + d3 + d8(0 + 211 + 216)。当我尝试再添加一个像素,值为0时,程序无法打印变量 blurr 的值。

更新:
似乎添加到变量 sum 最多可以完成三次,因为如果我注释掉另一个add,该值将打印在我的输出文件中。

blurrTopRow:
    ;from 0 - 251 there will be no pixels above the active pixel

    ;set ah to 0 to be sure that no other values changes the byte
    ;save byte in al, ax should be [0000](ah) value(al)
    mov ah, byte 0
    mov al, byte [info + 0]

    ;store sum all pixels in sum, divition will be done here
    add [sum], ax

    ;add pixel beside it (1)
    ;mov ah, byte 0
    mov al, byte [info + 1]

    ;add the value to sum
    ;add [sum], ax    If i add this value, the program stops working

    ;add the pixels below the first pixel
    ;move data to the first 8-bits
    mov ah, 0
    mov al, byte [info + 251]
    add [sum], ax

    ;set the last 8-bits in the 16-bit register (ax) to 0
    ;to avoid messing up the value
    mov ah, 0
    mov al, byte [info + 252]
    add [sum], ax

    ;devide the digit with 4
    mov eax, 0 
    mov ax, [sum]

    mov ebp, 4 
    mov edx, 0
    idiv ebp

    mov [blurr], al

    ret

我认为这是由于某些字节错误或有效的寻址,我还不明白。如果您想查看我的所有代码,可以在pastebin

中找到它

目前,我非常困惑为什么在我的总和中添加0会破坏程序,尤其是当我在上面的代码中已经完成此操作时。

最好
SEB

1 个答案:

答案 0 :(得分:3)

我有个主意 - 我不确定它是否正确:

在你的程序中,你打两次“打开”。有一次你评论了mov ecx, ...;另一次从未设置ecx寄存器:

openFileIn:
    mov eax, 5
    mov ebx, fileName
    ; <-- Here you are trusting Linux that ecx=0 on program start
    ;     This is not guaranteed;
    ;     it may change in future Linux versions!
    mov edx, 0777
    int 0x80
    mov [fd_in], eax
    ret

openFileOut:
    mov eax, 5
    mov ebx, outName
    ;mov ecx, 1   <-- why did you comment this out?
    ;                 Maybe "1" is not the correct value!
    mov edx, 0777
    int 0x80

在anoter行中,您将一些地址写入ecx寄存器:

readFromFileIn:
    mov eax, 3
    mov ebx, [fd_in]
    mov ecx, info       ; <-- Here
    mov edx, IMAGE_SIZE
    int 0x80
    ret

当您向代码添加说明时,程序中元素的地址可能会发生变化 - 包括info的地址。

我怀疑没有附加指令,info的地址是“开放”系统调用的有效参数偶然,而在插入指令后,地址不再有效“open”的参数。

您可以使用strace工具运行程序的两个变体来测试这一点,该工具会显示使用参数调用哪些系统调用。