0

このプログラムが出力できない理由がわかりません

+1 +2 +3 +4

出力は

+4214784 +1967600538 +2130567168 +1638356

アドレスだと思いますが、なぜですか?それを修正する方法は?

ここに私のコードがあります:

include irvine32.inc

.data
  matrix dword 1, 2, 3, 4

.code
  print proto, m:ptr dword

  main proc
    invoke print, addr matrix

    exit
  main endp

  print proc, m:ptr dword
    mov eax, m[0 * type m]
    call writeint

    mov eax, m[1 * type m]
    call writeint

    mov eax, m[2 * type m]
    call writeint

    mov eax, m[3 * type m]
    call writeint

    ret
  print endp

  end main

ご回答ありがとうございます <(__)>

4

1 に答える 1

0

mスタックに渡されるポインタです。アセンブラはのmようなものになり[ebp+8]ます。インデックス作成は、その位置から開始してスタック上のアイテムにアクセスしますが、それはあなたが望むものではありません。ポインタを逆参照する必要がありmます。これは、レジスタにロードする場合にのみ実行できます。

mov ecx, m  ; this will be mov ecx, [ebp+8] or similar
mov eax, [ecx + 0*4] ; first item
call WriteInt
mov eax, [ecx + 1*4] ; second item
call WriteInt
...

初心者が、どのコードが正確に生成されるかを理解せずに、アセンブラーの優れた機能を使用することはお勧めしません。

于 2012-12-06T12:38:18.287 に答える