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
「mov ecx、10」が間違っています。 _ECX_は、改行文字のASCII値ではない改行文字を含むバッファへのポインタである必要があります。 'curr'の空白文字に対しては正しく行います。改行でも同じことをします。 –
32ビットコードを実行できるLinuxディストリビューションで32ビットアプリケーションを作成している場合、このコードは動作します。 64ビットアプリケーションを作成する場合は、 'int 0x80'をダンプしてSYSCALLに移動することをお勧めします。この[information](http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)を参照してください。 –
関連:[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 –