0
extern putchar
extern exit
section .data

section .text
global main
main:

push 's'

mov eax, 2

cmp eax, 2

point:
call putchar
jz point

push 0
call exit

コンソールには、's' 文字が 1 つだけ表示されます。

コンパイルして実行します。

nasm -f elf ./prog.asm
gcc -m32 -o prog ./prog.o
./prog
4

2 に答える 2

5

は「0cmp 等しい」(つまり、ZF フラグを設定します) ただし、call putchar次の行の は によって設定されたフラグを破棄しているcmpため、jz機能しません (多かれ少なかれ偶然です)。pushf後で比較するためにフラグを保存する場合は、 andを使用できますが、フラグではなくスタック上の文字が必要になるpopfため、これは実際には機能しません。putchar

さて、あなたが述べなかった実際の問題に答えるために。's' を 2 回印刷したいとします。適切に行う方法は次のとおりです。

  mov eax, 2 ; init counter

print_loop:
  push eax; save the counter since it will be trashed by putchar
  push 's'
  call putchar
  add esp, 4 ; restore the stack pointer since putchar is cdecl
  pop eax ; restore the saved counter
  dec eax ; decrement it
  jnz print_loop ; if it's not yet zero, do another loop

add esp, 4pop eax少し短いコードの場合は、別のものに置き換えることができます。

于 2013-03-13T00:02:34.560 に答える
2

aを実行した結果、cmpフラグが設定され、zfゼロの場合などになります。次に、フラグが設定されているかどうかで分岐するか、set?命令の1つを使用して、alフラグが設定されているかどうかに基づいて値を設定します(レジスタなど)。

于 2013-03-12T22:26:35.090 に答える