Assembly 组件x86 EDI、SIL和DL寄存器的功能是什么? lk: 移动%edi,%r9d jmp.L8 L8: movzbl%sil,%eax movzbl%dl,%ecx leal-1(%rcx),%r8d cmpl%r8d,%eax jl.L4//如果(%eax
Assembly 组件x86 EDI、SIL和DL寄存器的功能是什么? lk: 移动%edi,%r9d jmp.L8 L8: movzbl%sil,%eax movzbl%dl,%ecx leal-1(%rcx),%r8d cmpl%r8d,%eax jl.L4//如果(%eax,assembly,x86,Assembly,X86,edi是一个寄存器,则它是一个通用寄存器,通常用于保存字符串操作的目标(scas等) 但与任何其他通用寄存器一样,可用于保存任何其他数据 一般来说,忘记汇编中的“类型”:汇编不是一种类型化语言,或者更好,任何数据都只是字节。它们可以有不同的大小,但仅此而已:寄存器可以保存任何x位(在本例中为32位,或4字节)数据,而您无法判断它是一堆字符、一个整数还是一个指针 (我假设您使用的是GNU汇编程序;在这种情况下,%something几乎总是一个寄存器) 哦,寄存器的不同部分有不同的名称:例如,%dl
edi
是一个寄存器,则它是一个通用寄存器,通常用于保存字符串操作的目标(scas
等)但与任何其他通用寄存器一样,可用于保存任何其他数据 一般来说,忘记汇编中的“类型”:汇编不是一种类型化语言,或者更好,任何数据都只是字节。它们可以有不同的大小,但仅此而已:寄存器可以保存任何x位(在本例中为32位,或4字节)数据,而您无法判断它是一堆字符、一个整数还是一个指针 (我假设您使用的是GNU汇编程序;在这种情况下,%something几乎总是一个寄存器) 哦,寄存器的不同部分有不同的名称:例如,
%dl
是“d”寄存器的低8位(edx
在32位机器上,rdx
在64位上)寄存器,%sil
表示esi
寄存器的低8位
您可以在优秀的英特尔汇编手册中找到所有这些信息。
在精通之前,这方面还有很多要学习的内容。至少,你应该开始学习。然后,我建议你看一些教程,阅读英特尔手册,例如,ecran和clavier her的变量类型是什么:寄存器%eax在函数lk的末尾做了什么,lk函数的C原型是什么不要打开同一主题的两个问题。这实际上减少了获得完整答案所需的更改。如果需要添加详细信息,可以编辑问题,请参阅常见问题解答重复:汇编不是类型化语言(至少不是x86汇编).正如在另一个答案中所建议的,它们可能是特定于平台的扩展/上下文中允许您访问屏幕、键盘等的东西。此外,无法确定lk的C原型是什么(它不是一个函数,只是一个标签:它没有标准的序言/尾声)假定C函数签名是
lk(uint32\u t,uint8\u t,uint8\u t)
,使用x86-64 System V调用约定。参数以RDI、RSI、RDX、RCX等形式传递。。。
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