我正在尝试将几个像素添加到一起,以便在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
答案 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
工具运行程序的两个变体来测试这一点,该工具会显示使用参数调用哪些系统调用。