3

アセンブリでスタックを使用する方法を理解しようとしていたところ、SO の質問の 1 つで次のコードに出くわしました。

push    ecx

mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, result_len
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, esp
add [ecx], DWORD 48
mov edx, 2
int 0x80

この場合、ecx は数値を保持しており、作成者は (間違っている場合は訂正してください!) 最初にスタック ポインターを ecx に移動し、次に ecx がメモリ アドレスに 48 を追加して数値を ASCII 文字に変換することによって数値を表示しています。指しています。彼は同じことを「pop ecx」で実行してから ascii に変換できたでしょうか? 著者がなぜこのように進めているのか、私にはよくわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

2

彼は同じことを「pop ecx」で実行してから ascii に変換できたでしょうか?

いいえ。sys_write システム コールには、出力する文字列へのポインタが必要です。スタックにプッシュecxすることで、 にポインター (アドレス) を作成しますesp

于 2014-10-27T03:56:18.617 に答える
0

コードを1行ずつ説明しましょう

push    ecx #ADDS THE VALUE IN THE REGISTER ECX TO THE STACK (TO SAVE IT FOR LATER USE...)

mov eax, 4 #USE stdout AS OUR OUTPUT
mov ebx, 1 #USE stdout AS OUR OUTPUT
mov ecx, result #POINTER TO THE MEMORY ADDRESS OF THE CHARACTERS TO OUTPUT
mov edx, result_len #MAX NUMBER OF CHARACTERS TO SHOW
int 0x80 #EXECUTE THE INTERRUPTION 0X80

mov eax, 4 #USE stdout AS OUR OUTPUT
mov ebx, 1 #USE stdout AS OUR OUTPUT
mov ecx, esp #MOVE THE POINTER FROM THE STACK POINTER OT THE ECX REGISTER THAT LETS US ACCESS EXC IN THE STACK
add [ecx], DWORD 48 #ADDS TO THE VALUE INSIDE OF THE ECX REGISTER THE VALUE OF 48 AS A DWORD TO FIT THE EXTENDED SIZE 
mov edx, 2 #MAX NUMBER OF CHARACTERS TO SHOW
int 0x80

これが行うことは、何かの値を取得してスタックに格納し、次に文字列を stdout に出力し、その後、以前にスタックに格納された値を取得し、それをすべてのレジスタに 48 追加して、最終的に出力することです。 .

これも役立つかもしれません: http://www.tutorialspoint.com/assembly_programming/assembly_system_calls.htm

于 2014-10-27T04:04:53.577 に答える