2017-09-01 12 views
2

NASMでblurrフィルタを実行するために、いくつかのピクセルを一緒に追加しようとしています。私は、00 + d3 + d8(0 + 211 + 216)の値を持つ3つのピクセルを追加することに成功しました。値0のピクセルをもう1つ追加しようとすると、変数ブラーの値が出力されません。NASMがバグ登録に値を追加する

更新:
私が別のaddをコメントアウトした場合、値は私の出力ファイルに出力されますので、変数合計に追加はは、最大で3回行うことができるようです。

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

プログラムは[blurr]変数に格納されている2バイトを出力します。 4回目のADD記述を使用すると、ファイルに値は保存されません。 (私はresentllyこれを知った、問題の説明を変更します) 私はまだデバッガを試していませんが、私はすぐにそれになります、ただそれは間違いなく印刷することはできませんいくつかの空気を取り、私のフラストレーションのABITのxD –

+0

をなだめるために必要引数として1を渡すので2バイト。とにかく、何も出力されていないことをどのようにチェックしましたか、そして入力ファイルは何ですか?デバッガで何を見つけましたか? – Jester

答えて

3

私はアイデアを持っている - 私はそれが正しいかどうかはわからない:あなたのプログラムで

あなたは2回を「開く」と呼びます。あなたが1回コメントしたのはmov ecx, ...です。 ecxレジスタが全く設定されていない他の時間:要素の

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

あなたのコードに命令を追加したアドレス:anoterラインで

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 

あなたはecxレジスタにいくつかのアドレスを書きますアドレスがinfoを含むプログラム内で変更されることがあります。

私は命令を挿入した後のアドレスは、もは​​や「開く」ための有効なパラメータである一方で、追加の指示なしinfoのアドレスが偶然で「オープン」システム・コールための有効なパラメータではないと思われます。

straceツールを使用してプログラムの両方のバリエーションを実行すると、どのシステムコールがどのパラメータで呼び出されたかを確認できます。

+0

これを実行しました今、私は出力を混乱させることなく、合計に移動データを追加することができます。だから私のファイルハンドラーはこの混乱を引き起こしました。 ファイルハンドラーの記述に不注意があったため、コードがstangeになったのはなぜですか? 多くのありがとうMartin、それは動作します!私はどんな奇妙な行動もせずに、ピクセルなどを追加することができます! –

関連する問題