1

例を見つけて、ガス用に編集していました。

extern printf
.global _start
.data
hello:
db "Hello", 0xa, 0
.text
_start:
mov %rdi, hello
mov %rax, 0
call printf
mov %rax, 0
ret

しかし、うまくいきません。どうしたの?これは何を意味するのでしょうか:

    hello:
db "Hello", 0xa, 0

メモリの範囲は理解していますが、この文字列は理解できません

db "Hello", 0xa, 0

そしてここ

_start:
mov %rdi, hello
mov %rax, 0
call printf
mov %rax, 0
ret

os: Linux (デビアン). インテル 64 ビット

4

3 に答える 3

1

それはnull-byte-terminatorです。C文字列としてよく知られています。文字列の終わりにあるそのようなバイトは、文字列がどこで終わるかを示します。たとえば、ポインタを文字列に渡してルーチンを呼び出すと、ルーチンは、メモリ上のそのような文字列の領域がa[0](C 用語で) 開始されてから表示されるまでであることを理解しa[x] == 0ます。

于 2013-03-23T17:08:19.617 に答える
0

次の例では、Hello の後に改行と null ターミネータが続く文字列を宣言しています。C 文字列には null ターミネータが必要です

db "Hello", 0xa, 0

printf を呼び出すには、スタックにパラメーターを渡す必要があるため、次のようになります。

mov hello, (%esp)
call printf

私の知る限り、慣習は移動元、移動先です。あなたはそれを逆にコーディングしたようです。

于 2013-03-23T17:01:13.023 に答える
0

行うことは、プログラムにバイトを配置することだけです。バイトは、文字「Hello」の後に 0xa (回線終端) が続き、最後に NULL バイトです。C では、"char *hello = "Hello\n";" のようになります。

_start: ラベルで、helloラベルのアドレスをレジスタ %rdi に配置し、0 を %rax に配置して、printf関数を呼び出します。

于 2013-03-23T16:44:04.890 に答える