Linux NASM为注册错误添加值
我试图将几个像素加在一起,以便在NASM中进行模糊过滤。我设法添加了三个像素,其值为00+d3+d8(0+211+216)。当我尝试添加一个值为0的像素时,程序无法打印变量Blur的值 更新: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
似乎最多可以向变量和添加三次,因为如果我注释掉另一个
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