2017-12-31 85 views
1

私は今、x86アセンブリを学び始めました。すべてのアスキー文字と改行を標準出力に出力する簡単なプログラムを作成しようとしました。 これは、改行を除いてすべてのものを期待どおりに出力します。理由を特定できません。 64ビットのubuntuオペレーティングシステムでnasmでコンパイルしました。ここ は、コードは次のとおりです。アセンブリで空行が表示されない

section .data 
curr db ' ' 

section .text 

global _start 

_start: 

    next: 

     ;print current character 
     mov eax,4 
     mov ebx,1 
     mov ecx,curr 
     mov edx,1 
     int 0x80 

     ;check condition and increment curr 
     inc byte [curr] 
     cmp byte [curr],126 
     jle next 

    ;new line and exit <--- doesn't work ??? 
    mov eax,4 
    mov ebx,1 
    mov ecx,10 
    mov edx,1 
    int 0x80 

    mov eax,1 
    mov ebx,1 
    int 0x80 
+2

「mov ecx、10」が間違っています。 _ECX_は、改行文字のASCII値ではない改行文字を含むバッファへのポインタである必要があります。 'curr'の空白文字に対しては正しく行います。改行でも同じことをします。 –

+1

32ビットコードを実行できるLinuxディストリビューションで32ビットアプリケーションを作成している場合、このコードは動作します。 64ビットアプリケーションを作成する場合は、 'int 0x80'をダンプしてSYSCALLに移動することをお勧めします。この[information](http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)を参照してください。 –

+1

関連:[32ビットint 0x80 Linux ABIを64ビットコードで使用するとどうなりますか?](https://stackoverflow.com/questions/46087730/what-happens-if-you-use-the-32 -bit-int-0x80-linux-abi-in-64-bit-code)を使用します。静的な格納場所の代わりにスタックスペースを使用した場合、コードは 'int 0x80'で失敗します。これを32ビットの実行可能ファイルとして構築している場合を除き、https://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64bit-system-gnu-toolchain/36901649 –

答えて

1

問題はそのシステムコールでは、ECXはポインタではなく、印刷したい文字であるということです。おそらくそれを変更するのでしょうか?

MOV byte [curr], 10 
MOV ECX, curr 
MOV EAX, 4 
MOV EDX, 1 
INT 0x80 
関連する問題