0

私は組み立てにかなり慣れていません。ユーザーから 1 つの値を取得する方法は知っていますが、ユーザーにスペースで区切られた 3 つの数字を入力させたい場合はどうすればよいでしょうか。

それぞれを別々のレジスタに格納しようとしているので、このようなものです。

push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number                                            
mov qword  rdi, formatfloatinput                            
mov qword  rsi, rsp                                         
mov qword  rax, 0                                           
call       scanf                                            


pop qword r15                   ;pop value from stack into r15                            
pop qword r14                   ;pop next value in stack into r14?
pop qword r13                   ;pop next value in stack into r13?

サンプル入力:13 15 36

r15これで、13 がr14含まれ、15r13が含まれ、36 が含まれます。

4

1 に答える 1

2

C に相当するものはscanf("%ld %ld %ld", &r15, &r14, &r13). 各出力変数に 3 つのポインターを渡す必要があることに注意してください。1 のみを渡します。また、formatfloatinput誤解を招く可能性があります。整数レジスタに読み込んでいます。整数形式が必要です。このようなものが動作するはずです:

push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
mov qword  rdi, format
mov qword  rsi, rsp                 ; &r15
lea rdx, [rsp+8]                    ; &r14
lea rcx, [rsp+16]                   ; &r13
mov qword  rax, 0
call       scanf
pop qword r15                   ;pop value from stack into r15
pop qword r14                   ;pop next value in stack into r14?
pop qword r13                   ;pop next value in stack into r13?
....
format: db "%ld %ld %ld", 0

あなたのようにプッシュしたりポップしたりするのは通常の書き方ではありませんが、それ自体は間違っていません。呼び出し規約で必要な場合は、スタックを揃えておくことを忘れないでください。

于 2013-10-07T10:42:28.440 に答える