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

不使用MOVZX/MOVSX的汇编中的零/符号扩展

高朝明
2023-03-14

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

我用的是8086组件

共有1个答案

巴宏恺
2023-03-14

所有x86-16 CPU都提供CBW(8位到16位)和CWD(16位到32位)指令。

如果要进行“通用”符号扩展(例如,从12位扩展到16位,而不是从8位扩展到16位),可以使用在任何CPU上工作的以下算法:

  • 执行和以获取要扩展的字的最高位

示例:符号从12位扩展到16位:

; Ensure that the value is really a 12-bit value
AND AX, 0xFFF
; Extract the highest bit
MOV CX, AX
AND CX, 0x800
; Subtract that value twice
SUB AX, CX
SUB AX, CX

可以通过仅处理AX的高位字节来简化上述代码(例如,和AH,0xF,而不是和AX,0xFFF)。

 类似资料:
  • 我阅读了Kip IRVINE的《x86处理器的汇编语言》一书,他写道: 将较小的值复制到较大的值 虽然MOV不能直接将数据从较小的操作数复制到较大的操作数,但程序员可以创建变通方法。假设计数(无符号,16位)必须移动到ECX(32位)。我们可以将ECX设置为零,并将计数移动到CX: 如果我们用一个等于-16的有符号整数尝试相同的方法,会发生什么? ECX(65,520)中的值与-16完全不同。另一

  • 我正在查看英特尔提供的指令的参考实现。页面是英特尔数字随机数生成器(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

  • 问题内容: 我需要从Java访问编号文件描述符-除0、1或2之外。 如何才能做到这一点?我查看了该类,但没有找到用给定的文件描述符号初始化它的任何方法。 作为一个具体示例,假设Java被另一种编程语言称为子进程。文件描述符3和4由另一种语言提供,用于输入和输出。 我在Java中需要的是和连接到这些文件描述符的对象,就像System.in,System.out和System.error都连接到文件描

  • 本文向大家介绍C#常用的字符串扩展方法汇总,包括了C#常用的字符串扩展方法汇总的使用技巧和注意事项,需要的朋友参考一下 本文实例汇总了C#常用的字符串扩展方法,分享给大家供大家参考。具体如下: EString.cs文件如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我只想检查矩阵是否是厄米特矩阵。设[][]为二维数组。C[][]是A[]]的共轭矩阵。T[][]是C[]]的转置矩阵。现在我要检查T[][]==A[][]。我编译了这个程序,输入了一个有效的厄米矩阵后,它说这个矩阵不是厄米矩阵。我找到了背后的原因。编译器将0==-0计算为false。但在我朋友的电脑里,编译器说矩阵是厄米特矩阵。我们都运行相同的代码。这背后的原因是什么?我要给你举个例子。我有一个元