私には、scanf
とchar*
というアセンブリが必要な作業があります。私はこのコードを試してみました:アセンブリ内のcharポインタをスキャンする
.data
INPUT_STRING: .string "Give me a string: "
SCANF_STRING: .string "%s"
PRINTF_STRING: .string "String: %s\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $32, %esp
pushl $INPUT_STRING
call printf #printf("Give me a string: ")
addl $4, %esp
pushl -12(%ebp) # char*
pushl $SCANF_STRING # "%s"
call scanf scanf("%s", char*)
addl $8, %esp
pushl -12(%ebp)
pushl PRINTF_STRING
call printf #printf("String: %s\n")
addl $16, %esp
movl -4(%ebp), %ecx
xorl %eax, %eax
leave
leal -4(%ecx), %esp
ret
それは私が何も入力したときに、それは、入力(そうscanf
作品)を待って、しかし、正しく最初のprintfダウン書き込み - >Segmentation fault
を。
私は、char*
は何とか初期化する必要がありますが、どのようにアセンブリレベルから行うことができますか?
私は地獄はがらくたことを告げたすべてのgcc -m32
しかし、次に、 '-12(%ebp)'に 'char *'を置いて、それが本当に長い場合はどうしますか?すべての文字はどこに保存されますか? – Frynio
@Frynio:スタックにあります。これは "subl $ 32、%esp"の一部です。本当に大きいか可変長の場合は、Cのように 'malloc'を使用します。Cライブラリを使用している場合 - Cプログラマのように考える:-) – rkhb
はい、わかります。しかし文字数の限界は何ですか? – Frynio