1

push_test() および pop_test() メソッドが何をテストしようとしているのかを理解するのを手伝ってもらえますか? これらのメソッドは何かをテストしようとしていますが、それが何であるかわかりません。

次のコードは c で記述されています。

int push_test() {
    int ret_val;
    /* movl %esp, %eax    ;; save stack pointer
       pushl %esp         ;; push stack pointer onto stack
       popl %edx          ;; pop the stack into %edx
       subl %edx, %eax    ;; subtract the two values
       movl %eax, ret_val ;; set up the return value
    */
    asm("movl %%esp, %%eax; pushl %%esp; popl %%edx; subl %%edx, %%eax; movl %%eax, %0"
          : "=r" (ret_val)
          : /* no input */
          : "%edx", "%eax");
    return ret_val;
 }

int pop_test() {
  int ret_val = 0xffffffff;  /* -1 in decimal */
  /* pushl ret_val       ;; save ret_val on the stack
     movl %esp, %edx     ;; save the stack pointer
     popl %esp           ;; pop stack into the stack pointer
     movl %esp, ret_val  ;; set the popped value as the return value
     movl %edx, %esp     ;; restore original stack pointer
  */
  asm("pushl %1; movl %%esp, %%edx; popl %%esp; movl %%esp, %0; movl %%edx, %%esp"
      : "=r" (ret_val)
      : "r" (ret_val)
      : "%edx");
  return ret_val;
}

int main() {
  printf("push test: %d\n", push_test()); 
  printf("pop test: %d\n", pop_test()); 
}

/* Output:
  push test: 0
  pop test: -1
*/
4

1 に答える 1

2

push_test()とは、スタックpop_test()の状態を保存し、スタック フレームを破棄してから、スタックの値に基づいて操作を実行しています。

pop_test()の各命令を見て、それが何をするかを理解しましょう(push_test()操作は非常に似ています)。

pushl ret_val-1 をスタックにプッシュし、スタック ポインター ( %esp) をインクリメントするため、現在のスタックは次のようになります{-1}

movl %esp, %edxスタック ポインタを にコピーする%edxため、スタックの位置 1 のメモリ アドレスが含まれているため、現在、%edxスタックは : : : のようになってい{-1}ます。%espstack[1]%edxstack[1]

popl %esp-1 をポップして に格納する%espため、スタックは次のようになります: {}, %esp: -1, %edx:stack[1]

movl %esp, ret_valの値%esp、現在は -1 を取り、それを に移動すると、-1 にret_valなりret_valます。

最後movl %edx, %espに の値を%edx戻して%esp-1 を返します。


このメソッドは常に -1 を返します。アイデアは、値をスタックにプッシュし、それをポップして、値が同じままかどうかを確認することです。また、スタックを破棄して再構築します (一時的に破棄してから復元することにより%esp)。これはおそらく何らかの学習アセンブリのような取引であり、実際のテスト方法ではないと思います。

于 2012-07-10T13:01:50.780 に答える