質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

LLVM

LLVM とは、コンパイル時や実行時に様々な最適化をするコンパイラ基盤です。 任意のプログラミング言語に対応可能で、LLVM自体はC++で実装されています。

Q&A

解決済

2回答

487閲覧

LLVM の機能でスタックポインタを操作する方法を知りたいです

u_09

総合スコア18

アセンブリ言語

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

LLVM

LLVM とは、コンパイル時や実行時に様々な最適化をするコンパイラ基盤です。 任意のプログラミング言語に対応可能で、LLVM自体はC++で実装されています。

0グッド

1クリップ

投稿2018/12/12 04:20

編集2018/12/12 04:30

LLVM7 を使用しています.

やりたいこと

スタック中に意図的に空白領域を挿入したく, LLVM で実装できないかと試しています.

質問

今考えているのは, 関数を呼び出す際に sp を動かし, リターン時に動かした分をもとに戻せばいいのではないかと考え, sp を操作する方法を探しています.
空白領域の挿入ができればよく, また LLVM もアセンブリも初心者の私が考えた方法ですので, そもそも sp の操作以外の方法があればそれでも問題ありません.

試してみたこと

はじめは, IRBuildr を使って IR を書き換えればよいのではないかと見ていたのですが, IR での関数呼び出しは call のみで表現されており, IR => アセンブリへ変換すると sp の操作などが現れるということに気が付き, IR では sp の操作はしておらずスタックをいじるということはできない気がしました.
そうなると, IR の call をアセンブリに展開している箇所を見ればよいのかと思ったのですがそれもよくわからず今詰まっています.

拙い質問で申し訳ないのですが, ご回答よろしくお願いします.

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

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

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

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

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

guest

回答2

0

Chironianさんに近い?意見ですが、

なぜ空白を取るのでしょう?
ということで0x00を指定すればいいのでは?

nask

1RESB 16 // 16バイトの空白(0x00)

アセンブリと言ってもいろいろですし、LLVMはわかりません。
(naskはOS自作入門という本のものです)

投稿2018/12/25 14:08

yukkuri

総合スコア624

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

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

0

ベストアンサー

こんにちは。

なんのためにスタックに空白領域を取りたいのでしょうか?
単に取るだけなら、使わないchar型配列をローカル変数として宣言すれば確保されますよ。

C++

1void foo() 2{ 3 char dummy[128]; // 128バイトの領域がスタック上に確保される 4}

投稿2018/12/12 05:00

Chironian

総合スコア23272

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

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

u_09

2018/12/12 05:18 編集

回答ありがとうございます. おっしゃるとおり, 私がやりたいことはまさにそういった動作なのですが, まず1つ目の理由としては, コンパイル時にすべての関数で空白領域を入れる機構を作りたいということがあり, できればソースコードに愚直に変数を追加するという方法は避けたいです. もう1つは, 空白領域のサイズなのですが, ページ境界までとしたいということがあります. そういった計算を伴うような処理をあとから追加するにはコンパイラ側で処理するのがいいのではないかと思い LLVM での実装を考えています. すみません. 説明不足でした. 目的に関しては, 事情により詳しく書くことができません. 質問をしている立場で情報を出し渋るものではないとは思うのですが申し訳ありません.
Chironian

2018/12/12 05:35

なるほど。 コンパイラのオプションで指定できそうな気もしますが、ちょっと分かりません。 コンパイラを修正する方は申し訳ないもっと分かりません。 お役に立てずすいません。
u_09

2018/12/12 05:55

こちらこそ本文中での説明が不足しておりすみません. ご回答いただけたおかげで補足できました. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問