Разница между MOV и MOV PTR - PullRequest
       74

Разница между MOV и MOV PTR

2 голосов
/ 30 апреля 2019

Я не понимаю разницу между MOV и MOV ptr.

Например, в этом C коде:

unsigned char x, y;
x = 2; 

вторая строка в сборке:

`MOV x, 2`

но вторая строка этого C кода:

tabbyte[0] = 15
unsigned char tabbyte[4]

в сборке:

MOV byte ptr tabbyte[0], 15

В чем разница между двумя сборкамиинструкции и когда каждый из них должен быть использован?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

Директивы BYTE PTR, WORD PTR, DWORD PTR

Бывают случаи, когда нам нужно помочь ассемблеру в переводе ссылок на данные в памяти.

Например, инструкция

    mov     [ESI], al  ; Store a byte-size value in memory location pointed by ESI

предполагает, что 8-разрядное значение должно быть перемещено, поскольку AL является 8-разрядным регистром.

Когда инструкция не имеет ссылки на размер операнда,

    mov     [ESI], 5   ; Error: operand must have the size specified

Чтобы обойти этот экземпляр, мы должны использовать директиву указателя, такую ​​как

    mov     BYTE PTR [ESI], 5  ; Store 8-bit value
    mov     WORD PTR [ESI], 5  ; Store 16-bit value
    mov     DWORD PTR [ESI], 5 ; Store 32-bit value

. Эти инструкции требуют, чтобы операнды были одинакового размера.

В общем случае оператор PTR заставляет выражение обрабатыватьсяв качестве указателя указанного типа:

    .DATA
    num  DWORD   0

    .CODE
    mov     ax, WORD PTR [num] ; Load a word-size value from a DWORD

http://www.c -jump.com / CIS77 / ASM / Instructions / I77_0250_ptr_pointer.htm

2 голосов
/ 30 апреля 2019

byte ptr, word ptr и т. Д. Требуются только для указания размера операции, если это не подразумевается операндами. Это квадратные скобки ([ и ]) и в MASM пустой символ, указывающий ссылку на память. Чтобы использовать адрес переменной в MASM, добавьте к нему префикс offset, для NASM просто опустите квадратные скобки.

GNU AS в режиме синтаксиса Intel в этом отношении ведет себя как MASM.

...