汇编: MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编: MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位相关的知识,希望对你有一定的参考价值。

请问“源操作数的符号位”是什么意思??
例如:
AL=87H,指令MOVSX CX, AL (CX)=0FF87H
谢谢!

符号填充是判源操作数的符号位,如果符号位为0,高位扩充0,如果符号位为1,高位扩充全1,在你这题中AL=87H=10000111B,转换成二进制后,最高位为1,即符号位为1,所以高位扩展8个1,这称为符号扩展,对带符号数来说,其值不变,所以CX=0FF87H追问

你好,我还是不理解什么是“符号位”,请问能跟我说一下吗?

追答

数分无符号数和带符号数,无符号数没有符号位,扩充时只要高位补0即可,带符号数把最高位看成是符号位,符号位为1是负数,符号位为0表示正数,当数进行扩充时,我不能改变它的值,你想如果都把高位扩充为0,那么不是有可能把负数扩充位正数,所以带符号数高位扩充要判其正,负,决定扩充0,还是扩充全1

参考技术A 楼上说的很详细了

Z80汇编:如何将带符号的8位值添加到16位寄存器?

我写了一个Z80反汇编程序,它从我的SBC中的ROM运行。我需要做的最后一件事(暂时尚未发现的错误)是转换相对地址并将它们作为绝对地址输出,这样当反汇编程序遇到五个JR操作码变体之一时,它会显示绝对地址JR操作码指向。

JR操作码变体使用8位偏移值来告诉Z80跳转到内存的哪个位置。偏移量是单个有符号(-128 < - > 127)字节,我需要将其添加到HL寄存器中的当前存储器位置以获得绝对地址。

我的大脑似乎正在遭受严重的语法错误,甚至可能被零除,因为我不能为我的生活找出如何将一个8位带符号(或2的补码)字节添加到16位注册以获取绝对地址。已经搜索了互联网,没有答案即将到来。

任何人都可以提出解决方案或指出我正确的方向吗?

答案

最简单的方法是将8位值扩展为16位,然后使用16位加法。这是一些代码。 A是8位有符号值,HL是8位有符号值将被添加到的16位基址。结果在HL

   LD  E,A
   ADD A,A      ; sign bit of A into carry
   SBC A,A      ; A = 0 if carry == 0, $FF otherwise
   LD  D,A      ; now DE is sign extended A
   ADD HL,DE

还要记住,对于JR,偏移量是相对于指令之后的地址,而不是JR指令本身的地址。

以上是关于汇编: MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言中 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. 这个 符号扩展和零扩展时啥意思?

MOVSX 汇编指令是如何工作的?

汇编movsx和movzx的区别

MOVSX装配说明如何工作?

汇编指令学习(MOV,MOVSX,MOVZX,LEA,XCHG)

汇编指令