Assembly x86,字节和字节PTR之间的差异
这两条线有什么区别?PTR在这里有什么变化Assembly x86,字节和字节PTR之间的差异,assembly,x86,nasm,masm,Assembly,X86,Nasm,Masm,这两条线有什么区别?PTR在这里有什么变化 ;first mov BYTE [ecx], 0 ;second mov BYTE PTR [ecx], 0 总结: 当操作数大小不是由另一个操作数暗示时,NASM/YASM需要word[ecx]。(否则[ecx]就可以了) 当操作数大小不是由另一个操作数暗示时,MASM/TASM需要字ptr[ecx]。(否则[ecx]就可以了) 他们每个人都对对方的语法感到窒息 警告:这是一个非常奇怪的区域,没有任何ISO标准或容易找到BNF表;我不是一
;first
mov BYTE [ecx], 0
;second
mov BYTE PTR [ecx], 0
总结:
- 当操作数大小不是由另一个操作数暗示时,NASM/YASM需要
。(否则word[ecx]
就可以了)[ecx]
- 当操作数大小不是由另一个操作数暗示时,MASM/TASM需要
。(否则字ptr[ecx]
就可以了)[ecx]
警告:这是一个非常奇怪的区域,没有任何ISO标准或容易找到BNF表;我不是一个穿越专有MASM语法雷区的专家 在您的情况下可能没有区别,但PTR操作员在其他情况下可能意味着: 通常,PTR运算符强制将表达式视为指定类型的指针: 我认为,还有特定于汇编程序的需求(nasm/tasm/other asm),使用“byte ptr”更便于移植 同时检查“汇编语言编程的艺术”中的第4.2.16节和第8.11.3节“类型冲突” 更新:多亏了Frank Kotler,NASM似乎“使用了英特尔汇编语法的变体”(wiki),其中不包括PTR操作 更新1:有来自英特尔的原件,1981-1983,PTR运算符定义见第4-15页: PTR操作员 语法:键入PTR name 描述:PTR运算符用于定义具有特定类型的内存引用。汇编程序根据指令的操作数类型确定要汇编的正确指令。在某些情况下,可以指定没有类型的操作数。这些情况涉及数字或寄存器表达式的使用。这里,PTR运算符用于指定操作数的类型。以下示例说明了此用途: 此表单还可用于重写变量或标签的类型属性。例如,如果希望以两个字节的形式访问已定义的word变量,可以编写以下代码: 字段值: 键入此字段可以有以下值之一:字节、字、DWORD、QWORD、TBYTE、近、远 此字段的名称可以是:1。变量名。2.标签名称。3.地址或寄存器表达式。4.表示偏移量的整数 更新2:感谢斯图加特大学的bitsaver!微软公司(1981年)发布了一份报告。第3-7页: 当使用正向引用时,PTR运算符可以用另一种方式为自己保存一个字节。如果将FOO定义为正向常量,则可以输入以下语句: 您可能希望将FOO称为字节立即数。在这种情况下,您可以输入以下任一语句(它们是等效的): 这些语句告诉宏86 FOO是一个字节立即数。生成一条较小的指令 第3-16页: 覆盖运算符 这些运算符用于替代变量和标签的线段、偏移、类型或距离 指针(PTR) 在阅读了本文并查看了这些文档中的一些语法定义之后,我认为编写PTR是必须的。根据MACRO-86手册,mov字节[ecx],0的用法不正确。摘要:
- 当操作数大小不是由另一个操作数暗示时,NASM/YASM需要
。(否则word[ecx]
就可以了)[ecx]
- 当操作数大小不是由另一个操作数暗示时,MASM/TASM需要
。(否则字ptr[ecx]
就可以了)[ecx]
警告:这是一个非常奇怪的区域,没有任何ISO标准或容易找到BNF表;我不是一个穿越专有MASM语法雷区的专家 在您的情况下可能没有区别,但PTR操作员在其他情况下可能意味着: 通常,PTR运算符强制将表达式视为指定类型的指针: 我认为,还有特定于汇编程序的需求(nasm/tasm/other asm),使用“byte ptr”更便于移植 同时检查“汇编语言编程的艺术”中的第4.2.16节和第8.11.3节“类型冲突” 更新:多亏了Frank Kotler,NASM似乎“使用了英特尔汇编语法的变体”(wiki),其中不包括PTR操作 更新1:有来自英特尔的原件,1981-1983,PTR运算符定义见第4-15页: PTR操作员 语法:键入PTR name 描述:PTR运算符用于定义具有特定类型的内存引用。汇编程序根据指令的操作数类型确定要汇编的正确指令。在某些情况下,可以指定没有类型的操作数。这些情况涉及数字或寄存器表达式的使用。这里,PTR运算符用于指定操作数的类型。以下示例说明了此用途: 此表单还可用于重写变量或标签的类型属性。例如,如果希望以两个字节的形式访问已定义的word变量,可以编写以下代码: 字段值: 键入此字段可以有以下值之一:字节、字、DWORD、QWORD、TBYTE、近、远 此字段的名称可以是:1。变量名。2.标签名称。3.地址或寄存器表达式。4.表示偏移量的整数 更新2:感谢斯图加特大学的bitsaver!微软公司(1981年)发布了一份报告。第3-7页: 当使用正向引用时,PTR运算符可以用另一种方式为自己保存一个字节。如果将FOO定义为正向常量,则可以输入以下语句: 您可能希望将FOO称为字节立即数。在这种情况下,您可以输入t
.DATA
num DWORD 0
.CODE
mov ax, WORD PTR [num] ; Load a word-size value from a DWORD
MOV WORD PTR [BX], 5 ;set word pointed to by BX = 5
INC DS:BYTE PTR 10 ;increment byte at offset 10
;from DS
MOV CL, BYTE PTR AWORD ;get first byte
MOV CL, BYTE PTR AWORD + 1 ;get second byte
MOV [BX],FOO
MOV BYTE PTR [BX],FOO
MOV [BX],BYTE PTR FOO
<attribute> PTR <expression>
CALL WORD PTR [BX][SI]
MOV BYTE PTR ARRAY, (something)
ADD BYTE PTR FOO,9
cat > foo.S << EOF
.intel_syntax noprefix
movb BYTE [ecx], 0
movb BYTE PTR [ecx], 0
.att_syntax prefix
EOF
as foo.S
objdump -dM intel a.out
0: 67 c6 41 01 00 mov BYTE PTR [ecx+0x1],0x0
5: 67 c6 01 00 mov BYTE PTR [ecx],0x0