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

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

ただいまの
回答率

90.50%

  • アセンブリ言語

    116questions

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

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

受付中

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 2,467

shimaokazu

score 18

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2016/05/28 01:30

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

    キャンセル

  • rubato6809

    2016/05/29 22:24

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

    キャンセル

回答 4

+1

ただの 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 がサイズ指定です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/29 22:37

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

    キャンセル

-1

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'

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • アセンブリ言語

    116questions

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