したがって、コンピュータ アーキテクチャ クラスの一環として、アセンブリに慣れる必要があります。または、少なくとも十分に慣れる必要があります。ユーザーへの入力を読み取ってから (当分の間) 再印刷しようとしています。これが私が試した方法です。これを疑似コードでレイアウトするには:
- msg 変数を宣言します (これは画面に出力されます)
- 十分な長さの値を持つ長さ変数 (sys_write 関数で使用される) を宣言します。
- スタックを一度ポップしてプログラム名を取得する
- スタックを再度ポップして、最初の引数を取得します
- スタックの現在の値を msg 変数に移動します
- msg を ECX に移動 (sys_write 引数)
- 長さを EDX に移動 (sys_write 引数)
- 標準出力を使用して sys_write を呼び出す
- カーネルコール
- sys_exit を呼び出して終了
これはこれまでの私のコードです
section .data
msg: db 'placeholder text',0xa;
length: dw 0x123;
section .text
global _start
_start:
pop rbx;
pop rbx;
; this is not working when I leave it in I get this error:
; invalid combination of opcode and operands
;mov msg, rbx;
mov ecx, msg;
mov edx, length;
mov eax, 4;
mov ebx, 1;
int 0x80;
mov ebx, 0;
mov eax, 1;
int 0x80;
省略した場合 (引数を msg に移動しない場合)、この出力が得られます
placeholder text
#.shstrtab.text.data
�@�$�`��
私たちは NASM を本当に始めたばかりなので、どんな助けでも大歓迎です。syscalls.kernelgrok.com/ http://www.nasm.us/doc/nasmdo11.htmlに一致するようにレジストリ名を私の理解の範囲内で適合させる例を適合させる
私は Ubuntu 12.04、64 ビット コンパイルを実行しています (これが正しい言葉であるかどうかさえわかりません) ELF64 で NASM を実行しています。このようなばかげた質問をして申し訳ありませんが、64 ビットを使用する NASM の十分に簡単なチュートリアルを見つけることができませんでした。 .