Linux NASM为注册错误添加值

Linux NASM为注册错误添加值,linux,assembly,x86,nasm,Linux,Assembly,X86,Nasm,我试图将几个像素加在一起,以便在NASM中进行模糊过滤。我设法添加了三个像素,其值为00+d3+d8(0+211+216)。当我尝试添加一个值为0的像素时,程序无法打印变量Blur的值 更新: 似乎最多可以向变量和添加三次,因为如果我注释掉另一个add,该值将打印在输出文件中 blurrTopRow: ;from 0 - 251 there will be no pixels above the active pixel ;set ah to 0 to be sure that

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

更新:
似乎最多可以向变量和添加三次,因为如果我注释掉另一个
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
我相信这是由于一些字节错误或有效的寻址,我还不明白。如果您想查看我的所有代码,可以在

目前,我非常困惑为什么在我的总和中添加0会破坏程序,特别是当我已经在上面的代码中这样做了

最佳

Seb

我有一个想法-我不确定它是否正确:

在您的程序中,您调用“open”两次。有一次,您注释掉了
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
当您向代码中添加指令时,程序中元素的地址可能会更改,包括
info
的地址

我怀疑在没有附加指令的情况下,
info
的地址碰巧是“打开”系统调用的有效参数,而插入指令后,地址不再是“打开”的有效参数


您可以通过使用
strace
工具运行两种版本的程序来测试这一点,该工具会显示哪些系统调用是使用wich参数调用的。

对“执行不正确和中断”的问题描述不好。发生了什么,调试器说了什么?程序打印出2个字节,存储在[Blur]变量中。第四次使用“添加说明”时,文件中不会保存任何值。(我最近发现了这一点,将更改问题描述)我还没有尝试过调试器,我将很快研究它,只是需要呼吸一下空气,缓解一下我的沮丧情绪,因为你通过1作为参数,它肯定无法打印2个字节。不管怎样,你是如何检查没有输出的,你的输入文件是什么?你在调试器中发现了什么?谢谢你的反馈Jester,你是对的,我打印了一个字节。我使用shell中的xxd函数进行检查。当我添加第四条add指令时,我的程序无法打印文件中的sum值。我现在将研究调试器,我不知道如何使用它,但我将尝试使用它,看看它说了什么,我将返回。好的,我尝试使用gdb调试器,得到的结果如下:次1(进程9758)退出,代码0357。将谷歌左右,我不知道这意味着什么:它做到了,现在我可以添加移动数据到总和,而不会弄乱输出。所以,是我的文件处理程序造成了这一切混乱。因此,代码行为如此奇怪的原因是我在filehandler描述中粗心大意!非常感谢Martin,它很有效!我可以添加更多的像素,这样就不会有任何奇怪的行为!
readFromFileIn:
    mov eax, 3
    mov ebx, [fd_in]
    mov ecx, info       ; <-- Here
    mov edx, IMAGE_SIZE
    int 0x80
    ret