Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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