我不了解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
这两个汇编指令之间有什么区别,何时应使用每个汇编指令?
答案 0 :(得分:4)
指令BYTE PTR,WORD PTR,DWORD PTR
有时候,我们需要协助汇编程序将引用转换为内存中的数据。
例如说明
mov [ESI], al ; Store a byte-size value in memory location pointed by ESI
由于AL是8位寄存器,建议应移动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
答案 1 :(得分:2)
byte ptr
,word ptr
等内容,则仅需指示操作的大小。它是方括号([
和]
),在MASM中,裸符号表示内存引用。要在MASM中使用变量的地址加上offset
前缀,对于NASM,只需省略方括号即可。
在英特尔语法模式下,GNU AS在这方面的行为类似于MASM。