-4
lk:
movl %edi , %r9d
jmp .L8

L8:
movzbl %sil , %eax
movzbl %dl , %ecx
leal -1(%rcx) , %r8d
cmpl %r8d, %eax
jl .L4 //if (%eax <%r8d) goto .L4
cltq // extend %eax int %rax
movl %esi, %eax
cmovle %edx, %eax // if (ecran(%rax)<=%dil) %eax=%edx
ret

main:
...
movzbl %bl,%eax
movsbl clavier(%rax), %ebp
movsbl le(%rip),%edx
movl $0, %esi
movl %ebl, %edi
call lk
movzbl %al, %esi
...
ret

関数で とと は何を表し%edi、その型は何ですか?%sil%dllk

4

1 に答える 1

6

ediはレジスタであり、文字列操作の宛先を保持するために一般的に使用される汎用レジスタです(scasなど)。
ただし、他の汎用レジスタと同様に、他のデータを保持するために使用できます。

一般に、アセンブリの「型」は忘れてください。アセンブリは型付き言語ではありません。より良いのは、データは単なるバイトです。それらは異なるサイズを持つことができますが、それだけです.レジスタは任意のxビット(この場合は32ビット、または4バイト)のデータを保持でき、それが一連​​の文字、整数、またはポインタであるかどうかはわかりません. .

(GNU アセンブラーを使用していると仮定します。その場合、%something はほとんど常にレジスターです)

ああ、レジスタのさまざまな部分にさまざまな名前があります。たとえば%dl、「d」レジスタの下位 8 ビット ( edx32 ビットマシンではrdx、64 ビット) レジスタであり%sil、レジスタの下位 8 ビットを表しesiます。

このすべての情報は、優れた Intel アセンブリ マニュアルで見つけることができます。熟練する前に、このテーマについて勉強することがたくさんあります。少なくとも、ウィキペディアを読み始める必要があります。次に、いくつかのチュートリアルを見て、Intel のマニュアルを読み、呼び出し規約を勉強することをお勧めします...

于 2013-06-20T09:00:33.823 に答える