アセンブリ言語でループ処理
0から4までの数字を順番に表示させていくプログラムを作りました。
cmd
10 21 32 43 54
Cで言うところの
c
1#include <stdio.h> 2 3int main(void){ 4 int cnt; 5 for(cnt = 0;cnt < 5;cnt ++){ 6 printf("%d\n",cnt); 7 } 8 return 0; 9} 10
これです。
さらに私は文字列とカウントを組み合わせて
cmd
1This is the 0 times 2This is the 1 times 3This is the 2 times 4This is the 3 times 5This is the 4 times
のように表示させたいです。
構造としては
"This is the" + カウント + "times"
でやります。
で、アセンブリ言語で書いてみました。
s
1.text 2 msg: .ascii "%s\0"; 3 msg2: .ascii "This is first times!\n\0"; 4 msg3: .ascii "%d\n\0" 5 msg4: .ascii "This is the \0" 6 msg5: .ascii "times\0" 7 .globl _main 8 9_main: 10 11LFB10: 12 sub $40,%esp #領域を確保 13 movl $0, 28(%esp) #カウントをセット 14 jmp L2 15 16L2: 17 cmpl $4,28(%esp) # カウントと4を比べる 18 jle L3 #4以下なら L3 へ飛ぶ。 19 add $40,%esp #4より大きければスタックを40バイト分閉じる 20 ret 21 22L3: 23 24sub $20,%esp #---------------------------- 25movl $msg4,4(%esp) 26movl $msg,(%esp) #"This is the" 27call _printf 28add $20,%esp #---------------------------- 29 30movl 28(%esp), %eax #------------------------- 31movl %eax, 4(%esp) 32movl $msg3,(%esp) #カウント 33call _printf #------------------------------ 34 35sub $20,%esp #--------------------------- 36movl $msg5,4(%esp) 37movl $msg,(%esp) #"times" 38call _printf 39add $20,%esp #----------------------------- 40 41addl $1, 28(%esp)#カウント 42jmp L2 43
実行させると・・・
s
1This is the times0 2This is the times1 3This is the times2 4This is the times3 5This is the times4
callしている順番は "This is・・・",count,"times"のはずなのですが・・・
うーん、何が原因で私の思惑通りの結果にならないのでしょうか?
一応、いちおう呼び出し規約もみたのですが
(調べ方が悪いのか、引数を右から~ 左から~ とかの話しか見つからない。)
どこを改善すればできるのかご教授お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/24 03:33
2019/10/24 03:44
2019/10/24 03:53
2019/10/24 03:59
2019/10/24 04:07
2019/10/24 06:34
2019/10/24 06:36
2019/10/24 07:17
2019/10/24 07:48