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

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

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

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

Q&A

4回答

5684閲覧

アセンブリ言語のレジスタに64bitのアドレスを入れる方法

shimaokazu

総合スコア26

アセンブリ言語

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

0グッド

2クリップ

投稿2016/05/25 15:07

x86_64系のアセンブリ言語を勉強しています。
レジスタの中にmovでメモリアドレスを直接代入したい場合などはどうすればよろしいのでしょうか?

mov rax,0x00007ff9db675160みたいに64bitのアドレスを直接代入した際にエラーをはかれてしまいました。

やり方等が間違っているのでしょうか。どなたかご教授願います。

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

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

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

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

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

yohhoy

2016/05/27 16:30

利用するアセンブラを明記してください。もし分かるなら、Intel記法なのかATT記法なのかを明記ください。
rubato6809

2016/05/29 13:24

エラーメッセージは何と出るのですか?
guest

回答4

0

ただの mov 命令だからエラーになると思います。
64 bit の演算である事を示すサイズ指定を mov 命令に付加する必要があると思います。
お使いのアセンブラが何かわかりません(わかっても私の手元では確認できないw)が、
mov を mov.q と書けばよいのでは?と推測します。アセンブラのマニュアルを調べてみてください。

ちなみに、私が手元で試せる gas (GNU Assembler)なら
movq $0x00007ff9db675160, %rax
と書いて、64bitの値をRAXレジスタにセットできます。
この movq の「q」はquadのqで「4倍長」を意味し、
64 bit を扱う命令だということを示します。gas では同様に、
32 bit なら movl $0x12345678, %eax
16 bit なら movw $0x1234, %ax
もしくは mov $0x1234, %ax でも同じ(即ち、基準が16 bitだから64 bit は4倍長)
8 bit なら movb $0x12, %al
と書きます。これらの q, l, w, b がサイズ指定です。

投稿2016/05/27 13:55

編集2016/05/27 14:01
rubato6809

総合スコア1380

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

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

0

Ubunts + NASM 64bit で作って見ました。

hoge4 って言うアドレス位置から相対参照して、
A(0x41)B(0x42)LF(0x0a)
を出力して終了します。

;******************************************* ; FILE: mov_memory.asm ; ; $nasm -f elf64 move_memory.asm ; $ld -o mov_memory move_memory.o ; $./mov_memory ; ;******************************************* ; Assembler Directives bits 64 ; target processor mode - 64bit section .bss ; hoge4: resb 8 ; 8 byte = (64bit) section .text ; global _start _start: ; global main ; main: ; this is NG!! ; mov rax,0x00007ff9db675160 ; mov rdx, [rax] ; NG segmentaition fault mov rbx , hoge4 ; レジスタ rbx に実行時に割り当てられたアドレスを設定 mov [rbx ], dword 0x41 ; raxに格納したメモリーアドレスに A (0x41) を設定 mov [rbx+1], dword 0x42 ; raxに格納したメモリーアドレス+1に B (0x42)を設定 mov [rbx+2], dword 0x0a ; raxに格納したメモリーアドレス+2に LF(0x0a)を設定 mov rax, 1 ; sys_write mov rsi, rbx ; mov rdi, 1 ; stdout ; length ( 3byte ) mov rdx, 3 ; syscall ; execute sys_write end_program: ;sys_exit(return_code) mov rax, 60 ; sys_exit mov rdi, 0 ; return 0 (success) syscall ; if this is not, then 'segmentaition fault'

以下はあまり自信がありませんので参考程度に。
値を直接指定してはメモリーアドレスは指定できないように思います。

例のように、変数宣言のように領域を確保してやれば相対的に参照可能です。

投稿2016/05/27 15:31

simple-teq

総合スコア37

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

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

0

お使いアセンブラに依存します。

アセンブラがGASなどで使われているAT&Tシンタックスで解釈していていれば、mov rax,0x00007ff9db675160はraxの値を0x00007ff9db675160に転送するという意味になりエラーになります。(gccのインラインアセンブラはこっちだったかな?)。

一方intelシンタックスではmov rax,0x00007ff9db675160の即値が0xで始まる記法に対応していれば普通はエラーにならないと思います。

投稿2016/05/25 22:01

編集2016/05/25 22:03
sharow

総合スコア1149

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

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

0

自分は8bit世代なので、最近のCPUについてはまるで素人ですが…

mov rax,0x00007ff9db675160 は命令の選択が間違っていると思います。

「MOV」命令は「データ転送」のための命令で、オペランドに指定されたメモリーもしくはレジスタの「内容」を移動するためのものですから、「即値」は指定出来ないのではないでしょうか?
⇒実効アドレスをレジスタに設定するには「LEA」命令を使います。
プログラミングノート - x86
Linux で64bitアセンブリプログラミング (06)
⇒「MOV」および「LEA」のリンクをクリックすると、より詳しい説明をご覧になれます。
fty.com/herumi/prog/x64.html)

投稿2016/05/25 20:44

pi-chan

総合スコア5936

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

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

rubato6809

2016/05/29 13:37

上記、プログラミングノート - x86 のページに mov rax, 123456789abcdefh という例があるので、命令のサイズ指定は必要ないかもしれません。 そうすると16進数の表記が原因という可能性がありますね。0x~ではなく、0~hと指定する、即ち mov rax,07ff9db675160h を試してみるとか。 ともかく、エラーメッセージは何と言ってるのか、です。それではっきりするのでは? 単に、そのアセンブラが64bit命令に対応していないという可能性もありますから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問