2017-09-01 63 views
2

我嘗試添加幾個像素在一起,以便做羅嗦濾波器NASM。我已經設法添加三個像素,其值爲00 + d3 + d8(0 + 211 + 216)。當我嘗試添加一個像素,值爲0時,程序無法打印變量blurr的值。NASM增值登記錯誤

更新:
似乎增加了可變總和產品可在完成三次,因爲如果我註釋掉另一個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在我總和打破了計劃,尤其是當我在已經做到了這一點上面的代碼。

最好
勒布

+2

_「不正確執行並且中斷」_不是一個好問題描述。發生了什麼,調試器說什麼? – Jester

+0

該程序打印出2個字節,存儲在[blurr]變量中。當我第四次使用ADD描述時,文件中不會保存任何值。 (我resentlly發現了這一點,會改變問題的描述) 我還沒有嘗試調試的是,我會考慮它很快,只需要採取一些空氣和撫慰我的無奈升技的xD –

+0

決不能打印自從傳遞1作爲參數以來,有2個字節。無論如何,你是如何檢查沒有輸出,什麼是你的輸入文件?你用調試器發現了什麼? – Jester

回答

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的地址是「開放」的系統調用偶然一個有效參數,同時插入指令後的地址不再是「開放」的一個有效參數。

你可以通過與strace工具,它顯示了哪些系統調用被調用至極參數運行程序的這兩個變種進行測試。

+0

這樣做,現在我可以將移動數據添加到總和中而不會搞亂輸出。所以這是我的文件處理程序造成這一切的混亂。 因此,代碼表現如此之大的原因是因爲我在文件處理程序描述中粗心大意! 非常感謝馬丁,它的工作原理!我可以添加更多像素,並且沒有任何奇怪的行爲! –