×

Search anything:

MOVSX, MOVSXD - Move with Sign Extend, Doubleword

C++

Binary Tree book by OpenGenus

Open-Source Internship opportunity by OpenGenus for programmers. Apply now.

In this article at OpenGenus, we have covered 2 important assembly instructions namely MOVSX and MOVSXD which is used to move a data considering sign bits. It is an alternative to MOVZX.

Table of contents:

  1. MOVSX - Move with Sign Extend
  2. C program using MOVSX as intrinsic
  3. MOVSXD - Move with Sign Extend Doubleword

MOVSX - Move with Sign Extend

MOVSX stands for "Move with Sign Extend".

MOVSX is an assembly instruction that is used to copy data from a source operand to a destination operand where the sign occupies the extra bits in the destination. If the source operand stored a negative number, then 1 is stored in the extra bits. For positive number, 0 is stored in the extra bits.

MOVSX instruction is available on all x86 and x86-64 processors.

Following is an example of using MOVSX in Assembly code:

mov al, -5    ; store -5 in the al register
movsx eax, al ; zero-extend al to eax

Example:

-5 is stored in AL register (8 bits) and it is stored as 2s complement. The content of AL register will be 11111011.

After movsx operation, the value of eax will be: 11111111111111111111111111111011

The last 8 bits are same as AL and all other 24 bits are 1 as AL stores a negative number.

If AL stored 5, then content of AL = 00000101

After the movsx operation, the value of eax will be: 00000000000000000000000000000101

The last 8 bits are same as AL and all other 24 bits are 0 as AL stores a positive number.

C program using MOVSX as intrinsic

The intrinsic for MOVSX is _mm_cvtsepi16_epi32. It takes a 16 bit data and converts to a 32 bit data with sign extension.

Following is the complete C program using MOVSX as intrinsic:

#include <stdio.h>
#include <immintrin.h>

int main() {
    short a = -32767;
    int b = _mm_cvtsepi16_epi32(_mm_cvtsi32_si128(a));
    printf("%d\n", b);
    return 0;
}

MOVSXD - Move with Sign Extend Doubleword

MOVSXD stands for "Move with Sign Extend Doubleword".

MOVSXD is an x86-64 instruction that is same as MOVSX in functionality and moves a doubleword (32 bits) or quadword (64 bits) from a source operand to destination operand. MOVSX operates on 16 bit data for a system with 16 bit word.

Following is an example of using MOVSX in Assembly code:

mov al, -12    ; store -12 in the al register
movsxd eax, al ; zero-extend al to eax

With this article at OpenGenus, you must have the complete idea of MOVSX and MOVSXD assembly instructions.

MOVSX, MOVSXD - Move with Sign Extend, Doubleword
Share this