おそらく非常に初心者の質問ですが、それを機能させる方法に本当に興味があります。
私は次のアセンブリコードを持っています ( here、 rename() の例から大いにインスピレーションを得ています):
[SECTION .text]
global _start
_start:
mov esi, msg ; saves pointer to string to ESI
xor eax, eax
mov byte [esi+6], al ; terminates first string with NULL char
mov byte [esi+13], al ; terminates second string with NULL char
mov byte al, 38 ; syscall number (38 = rename)
lea ebx, [esi] ; put the adress of /tmp/a in EBX
lea ecx, [esi+7] ; put the adress of /tmp/b in ECX
int 0x80 ; syscall execution
mov al, 0x01 ; prepare to exit!
xor ebx, ebx
int 0x80 ; exit!
[SECTION .data]
msg: db '/tmp/a#/tmp/b#'
説明させてください: このプログラムは syscall を呼び出して、ファイルの名前をrename
に変更します。セクション .data の文字列には、ソース ファイルの名前とターゲット ファイルの名前が含まれています。/tmp/a
/tmp/b
NULL を避けたいので、NULL の代わりに # を入れて実行時に変更することにしました。ただし、プログラムは SEGFAULT で終了します。.data セグメントの # 文字の書き換えに問題があるようです。私の質問は、どのように対処して機能させるべきですか? 私はそれが初心者の質問であることを知っています.おそらく私は何か非常に重要なものを見逃しています.
アドバイスをありがとう。
EDIT - アセンブルとリンクに使用されるコマンド
これはNASM用です:
nasm -f elf -o ThisWorks.o ThisWorks.asm
これはリンカ用です (私は 64 ビットの Phenom II を持っていますが、32 ビットとしてビルドしていることに注意してください)。
ld -melf_i386 -o ThisWorks.aout ThisWorks.o
私がそれを実行するよりも:
./ThisWorks.aout
結果は次のとおりです。
Segmentation fault
分解
による分解ですobjdump -D ThisWorks.aout
ThisWorks.aout: file format elf32-i386
Disassembly of section .text:
08048080 <_start>:
8048080: be 9c 90 04 08 mov $0x804909c,%esi
8048085: 31 c0 xor %eax,%eax
8048087: 88 46 06 mov %al,0x6(%esi)
804808a: 88 46 0d mov %al,0xd(%esi)
804808d: b0 26 mov $0x26,%al
804808f: 8d 1e lea (%esi),%ebx
8048091: 8d 4e 07 lea 0x7(%esi),%ecx
8048094: cd 80 int $0x80
8048096: b0 01 mov $0x1,%al
8048098: 31 db xor %ebx,%ebx
804809a: cd 80 int $0x80
Disassembly of section .data:
0804909c <msg>:
804909c: 2f das
804909d: 74 6d je 804910c <_end+0x60>
804909f: 70 2f jo 80490d0 <_end+0x24>
80490a1: 61 popa
80490a2: 23 2f and (%edi),%ebp
80490a4: 74 6d je 8049113 <_end+0x67>
80490a6: 70 2f jo 80490d7 <_end+0x2b>
80490a8: 62 23 bound %esp,(%ebx)
解決
デバッグは、そのプログラムが正常に動作することを示しましたが、名前を変更するファイルがない場合、segfault に陥ります。それ以外の場合、私のコードは期待どおりに機能します。そのために残念。