🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

2回答

4783閲覧

アセンブリ言語 ループ処理 カウントの表示について

kazuyakazuya

総合スコア193

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2019/10/24 02:53

編集2019/10/24 02:57

アセンブリ言語でループ処理
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"のはずなのですが・・・

うーん、何が原因で私の思惑通りの結果にならないのでしょうか?

一応、いちおう呼び出し規約もみたのですが

(調べ方が悪いのか、引数を右から~ 左から~ とかの話しか見つからない。)

どこを改善すればできるのかご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

VisualStudio使ってるなら、機械語ベースで、任意のアドレスで実行止めてメモリ内容を参照できるんで、そうやって確認していきなさい。
スタックに積まれるデータと各レジスタがどういう挙動するかを見ていけば、なにか異常があればわかるでしょ

それをした上で、不明な点があれば聞きに来なさい

投稿2019/10/24 03:31

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/10/24 03:33

回答ありがとうございます。 メモリ容量の関係で visual stdioではなく MinGWアセンブラ(?)を使っています。
y_waiwai

2019/10/24 03:44

これからもアテずっぽでコード書いて、動かなかったらここに質問建てるんですか。 まあ、がんばってくれとしか言いようがないですが。 ここの回答で、ここをこうしたら動いた!よかった!で、そりゃいいんだろうけど、あなたの知識やスキルにはなりませんぜw
kazuyakazuya

2019/10/24 03:53

そういうものなのでしょうか・・・。
y_waiwai

2019/10/24 03:59

まあ、あなたの思うようにすればよろしい。 上から目線でどーこー言われるのが嫌なら、無視すればよろしい #わたしがかつてそーしてきたよーにw
rubato6809

2019/10/24 06:34

MinGWを使ったことはないけど gdb (Gnu DeBugger)もインストールされている(追加インストールできる?)のではないかな。コンソールから $ gdb とタイプしてみたら、あるかどうか位はわかるでしょう。
rubato6809

2019/10/24 06:36

あ、$はシェルのプロンプトだから、タイプするのは gdb の3文字だけよ。
asm

2019/10/24 07:17

win環境ならx64dbgとかollydbgとか使ったほうが楽 英語アレルギーなら、うさみみハリケーンになるんだろうが gdbをGUIで操作するような独特の操作感と面倒くささが難しいですね
kazuyakazuya

2019/10/24 07:48

あ、gdb使えるようです。 容量の関係もあり、gdbを使い続けるかもしれません。
guest

0

自己解決

再コンパイルしたところ、いきなり私の思惑通りに表示されました。

(コード同じのはずなんだけどなぁ・・・)

投稿2019/10/24 03:24

kazuyakazuya

総合スコア193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問