x86_64系のアセンブリ言語を勉強しています。
レジスタの中にmovでメモリアドレスを直接代入したい場合などはどうすればよろしいのでしょうか?
mov rax,0x00007ff9db675160みたいに64bitのアドレスを直接代入した際にエラーをはかれてしまいました。
やり方等が間違っているのでしょうか。どなたかご教授願います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア1382
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア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総合スコア1151
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/29 13:37

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。