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
中的含义以及它们的类型是什么?
答案 0 :(得分:4)
edi
是一个寄存器,通常用于保存字符串操作的目的地(scas
等)。
但与任何其他通用寄存器一样,可用于保存任何其他数据。
一般来说,忘记汇编中的“类型”:汇编不是类型语言,或者更好的是任何数据都只是字节。它们可以有不同的大小,但这就是全部:寄存器可以保存任何x位(本例中为32位,或4位)数据,并且无法判断它是一堆字符,整数还是指针
(我假设你使用的是GNU汇编程序;在这种情况下,%some几乎总是一个寄存器)
哦,你对寄存器的不同部分有不同的名称:例如%dl
是“d”寄存器的低8位(edx
on 32位机器,64位的rdx
寄存器,%sil
代表esi
寄存器的低8位。
您可以在优秀的英特尔装配手册中找到所有这些信息。 在熟练之前,有很多人要研究这个问题。至少,你应该开始reading wikipedia。然后,我建议您查看一些教程,阅读英特尔手册,study calling conventions,...