-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%dl代表什么lk,它们的类型是什么?

4

1 回答 1

6

edi是一个寄存器,一个通用的寄存器,通常用于保存字符串操作(scas等)的目的地,
但与任何其他通用寄存器一样,可用于保存任何其他数据。

一般来说,忘记汇编中的“类型”:汇编不是一种类型化的语言,或者更好的是,任何数据都只是字节。它们可以有不同的大小,但仅此而已:寄存器可以保存任何 x 位(在这种情况下为 32 位或 4 字节)数据,您无法判断它是一堆字符、整数还是指针.

(我假设您使用的是 GNU 汇编程序;在这种情况下, %something 几乎总是一个寄存器)

哦,您对寄存器的不同部分有不同的名称:例如%dl,“d”寄存器的低 8 位(edx在 32 位机器上,rdx在 64 位上)寄存器,%sil代表寄存器的低 8 位esi

您可以在出色的英特尔组装手册中找到所有这些信息。在精通之前,有很多东西需要学习。至少,您应该开始阅读 wikipedia。然后,我建议你看一些教程,阅读英特尔手册,学习调用约定,......

于 2013-06-20T09:00:33.823 回答