みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

アセンブラのシステムコール

プログラムを趣味でやっています。
大変たのしいですが、わからない事ばかりで苦戦しています。
今は、下記のプログラムが、うまくいかなくて悩んでいます。

使用機器はMacBook Pro で、nasmを使っています。
何だかオープンがうまくいっていない様な感じです。
誰か、助けて下さい。

--- test.asm ---
global _main
section .text
_main:
mov rax, 0x2000005 ; 'open' syscall
lea rdi, [rel fname] ; file name
mov rsi, 0x042 ; write mode
mov rdx, 0666o ; permissions set
syscall

mov [rel fd], rax

mov rax, 0x2000004 ; 'write' syscall
mov rdi, [rel fd] ; file descriptor
lea rsi, [rel buffer] ; buffer address
mov rdx, buffer.length ; buffer string length
syscall

mov rax, 0x2000006 ; 'close' syscall
mov rdi, [rel fd] ; file descriptor
syscall

movrax, 0x2000001
movrdi, 0
syscall

section .data
fname: db "Hello.txt", 0
fd: dq 0
buffer: db "Hello,world!!"
.length: equ $-buffer

一体どこがわるいんでしょう?
よろしくお願いします。

投稿日時 - 2015-08-31 16:15:51

QNo.9039733

困ってます

質問者が選んだベストアンサー

> raxを調べると、0x0002が返ってくるようです。

-2 (0xff..fe) ということですか?
0,1,2 が stdin,out,err ですから正常なら >=3 が想定されるところです。

> ということは、「ファイルが存在しない」なのでしょうか?

2==ENOENT ならそうなりますが、O_CREAT が指定されていればエラーするにしても別のエラーコードになりそうです。

> もしかして、パラメータの数字が違うのかも知れません。

自分も初めにこれを疑いました。
別 OS は当然として同じ OS でもバージョン違いの情報は当てにできません。もう一度 /usr/include 配下のヘッダファイルを確認するか、C に書き起して cc -E などでマクロ展開の結果と突き合わせることをお勧めします。
ヘッダのパスとかコンパイラドライバはお使いのものに読み換えてください

投稿日時 - 2015-09-06 14:47:28

お礼

ありがとうございました。

書き込みは研究の余地がありますが、なぜか'00'が書き込めれる。
読み込みは、テキストファイルが読み込めました。

パラメータの値が違ったのだと思います。

どうも、お世話かけました。
皆様に、良いアドバイスをいただき感謝いたしました。

投稿日時 - 2015-09-06 19:43:36

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

> O_TRUNCを調べましたところ、0x200を足すと良いらしいです。
> が、それでもうまく動きません。

エラーコードは確認してみましたか?
> mov [rel fd], rax
が負数で errno に対応してると思います。open(2) の説明にある ENOENT, EPERM とかです

にしても 0x2000005 番台なんですね。5,4,6 の対応は FreeBSD とかと一緒ですが。

投稿日時 - 2015-09-04 20:30:59

お礼

どうも、ありがとうございます。

raxを調べると、0x0002が返ってくるようです。
ということは、「ファイルが存在しない」なのでしょうか?

もしかして、パラメータの数字が違うのかも知れません。

投稿日時 - 2015-09-05 20:50:52

ANo.1

> 何だかオープンがうまくいっていない様な感じです。

自分は試せないが、レジスタの用途自体は合ってるとしたら
> mov rsi, 0x042 ; write mode
これ O_WRONLY | O_CREAT | O_TRUNC ですか?
# 1bit 足りないから trunc なしか...

投稿日時 - 2015-09-01 17:12:06

お礼

どうもありがとうございます。

O_TRUNCを調べましたところ、0x200を足すと良いらしいです。
が、それでもうまく動きません。

教えていただいてありがとうございます。
どうも、どうもです。

投稿日時 - 2015-09-04 19:58:02

あなたにオススメの質問