当前位置: 首页 > 知识库问答 >
问题:

x86汇编中符号扩展中的前导零?

苏弘盛
2023-03-14

我阅读了Kip IRVINE的《x86处理器的汇编语言》一书,他写道:

将较小的值复制到较大的值

虽然MOV不能直接将数据从较小的操作数复制到较大的操作数,但程序员可以创建变通方法。假设计数(无符号,16位)必须移动到ECX(32位)。我们可以将ECX设置为零,并将计数移动到CX:

.data
count WORD 1
.code
mov ecx,0
mov cx,count

如果我们用一个等于-16的有符号整数尝试相同的方法,会发生什么?

.data
signedVal SWORD -16 ; FFF0h (-16)
.code
mov ecx,0
mov cx,signedVal ; ECX = 0000FFF0h (+65,520)

ECX(65,520)中的值与-16完全不同。另一方面,如果我们首先用FFFFFFFFh填充ECX,然后将signedVal复制到CX,那么最后的值将是正确的:

mov ecx,0FFFFFFFFh
mov cx,signedVal ; ECX = FFFFFFF0h (-16)

我的问题是最后一部分。我认为上面代码的第一行我们应该写mov ecx,fffffffffff h,而不是0FFFFFFFFh。换句话说,前导零是什么?

共有2个答案

杜骏祥
2023-03-14

要区分符号(即变量)和数字,您必须以十进制数字开头。

mov ecx的数值参数始终存储为32位,无论您在代码中写入的数字是多少(只要最终值小于2^32)。忽略前导零。

与以0开头的C/C数字不同,以0开头的C/C数字不被解释为八进制数字(如果您担心的话)。八进制数字以0t开头。

慕逸仙
2023-03-14

为了区分标签和数字文字,大多数汇编程序要求后者始终以数字开头,即使它只是一个无关紧要的零。

如果你计算0ffffffffh中有效十六进制数字的数量,你会发现它们实际上是八个,每个数字携带四位信息<8乘以4等于32<您的文字长度为36位。

简单地说,像dah、e0h等数字必须用前导0来写<在你的脑海里,你应该自动去掉多余的零。

 类似资料:
  • 我试图进行零或符号扩展,但不使用或<我基本上想模仿上述命令,但不想使用它们。有办法吗 要从左侧添加0,有SHR,但我不确定它是否工作相同,因为它会更改值。。。 我用的是8086组件

  • 我正在查看英特尔提供的指令的参考实现。页面是英特尔数字随机数生成器(DRNG)软件实现指南,代码来自英特尔数字随机数生成器软件代码示例。 以下是英特尔的相关部分。它读取一个随机值并将其置于val中,并在成功时设置进位标志。 索里不得不问。我认为GNU Extended Assembler并没有涵盖它,搜索“=qm”会产生虚假的点击。 扩展汇编器中的是什么意思?

  • GCC扩展内联汇编 使用GCC扩展内联汇编的例子如下: #define read_cr0() ({ \ unsigned int __dummy; \ __asm__( \ "movl %%cr0,%0\n\t" \ :"=r" (__dummy)); \ __dummy; \ }) 它代表什么含义呢?这需要从其基本格式讲起。GCC扩展内联汇编的基本格式是: asm [volat

  • 我很难理解由一个简单的C程序的gcc创建的汇编语言输出。 以下是该程序的C代码: 下面是gcc创建的汇编代码: 我很难理解汇编代码中某些指令的操作数顺序(参考内存布局,请参阅内存布局图)。首先,有指令 它将调用方的基指针推送到堆栈上。这条指令之后是下面的指令: 此指令应将被调用方的基指针设置为当前堆栈指针的值。但是,两个操作数的顺序是否应该相反(例如,movq%rbp,%rsp)? 类似的“问题”

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture x86汇编语言,包括了Intel x86 Assembly& Microarchitecture x86汇编语言的使用技巧和注意事项,需要的朋友参考一下 示例 x86汇编语言家族代表了最初的Intel 8086架构数十年来的进步。除了基于所使用的汇编器的几种方言外,多年来添加了附加的处理器指令,寄存器和其他功

  • 假设我们有两个寄存器长度2有符号1整数,例如