程序集是否理解非十六进制的数字?
Does Assembly understand numbers that are not hexadecimal?
如果我的问题听起来很荒谬,请原谅我。
但是我很迷茫,说我定义的是常量buffer_size
我正在研究的代码中有一行内容是:buffer_size equ 16
,在我看来,这意味着,使 buffer_size
16 变大。但在我查看的其他代码示例中,数字旁边确实有字符 h
,我被告知这是告诉汇编程序将数字视为十六进制。
如果一个数字旁边没有 h
,那么它会变成十进制吗?
是的,MASM(以及几乎所有其他现代汇编程序1)就像C/C++:默认情况下数字文字是十进制的.
您可以使用带后缀的其他碱基。有关语法,请参阅 How to represent hex value such as FFFFFFBB in x86 inline assembly programming?。一些汇编程序,如 NASM,允许 0x123
以及 123h
,但 MASM 仅 允许后缀。
MASM 中的 10h
与 C 中的 0x10
完全相同,并且完全等同于 16
.
汇编的机器代码不依赖于数字的源表示。 (mov eax, 10h
是5个字节:操作码,然后是32位小端二进制数,与mov eax, 16
相同。)
foo: db 0FFh
也是如此:向其添加内容的代码不是 "adding hex numbers",它只是一个普通的二进制数。 (一个常见的初学者错误(在术语或理解上,通常不清楚是哪个)是将源代码表示与机器在运行汇编程序输出时正在做的事情混淆。
脚注 1:古代汇编程序可能有所不同。可能有一些非 x86 平台的汇编程序也不默认为十进制。
过时的 DOS DEBUG.EXE 内置的一个将所有数字文字视为十六进制,因此 mov ax, 10
= mov ax, 8+8
。 (如果它甚至计算常量表达式,但如果不是那么你明白我的意思。)
DEBUG.EXE 甚至不支持标签,所以以现代标准来看它基本上是可怕的;不要使用它。现在有像 NASM 这样的免费开源汇编器,也有调试器,至少包括 BOCHS 内置的一个,所以没有必要为旧工具所苦。
无论如何,这个关于 DEBUG.EXE 的旁路与你关于 MASM 的问题并不相关;我只是将它作为我所知道的不默认为十进制的汇编程序的唯一示例。它们确实存在,但现在不正常。
小心,要知道汇编语言通常不像许多高级语言那样标准化,所以问题很模糊,你甚至没有说明指令集。标签 masm32 暗示 x86(该标签是为您添加的)。
您似乎想要 x86 和 masm 汇编程序家族的特定子集。
汇编一般是由汇编器、工具定义的,不是指令集。因此,当想了解汇编语言的工作原理或其规则时,您必须查看汇编程序本身。它的文档如果有或者足够好,如果没有你必须试验。
我手边没有 masm32,需要一些努力才能得到它,但我有另一个现成的汇编程序,您可以通过实验回答您自己的问题。 (正如在另一个答案中已经指出的那样,是的,如果 masm 中没有 h,它默认为十进制)
mov al,10h
mov al,0x10
mov al,10
反汇编为
00000000 B010 mov al,0x10
00000002 B010 mov al,0x10
00000004 B00A mov al,0xa
在这种情况下,未指定意味着默认为十进制,这是您至少应该期望来自 masm 的指令。
Non-instruction 语法也是汇编语言的一部分,其语法规则可能与该语言的指令部分不同。人们希望一种工具始终对数字使用相同的规则,但你永远不知道。
同样,可能有一些指令使用立即数作为寄存器的偏移量,而不是将值加载到寄存器中,希望那些 immediates/values 也遵循相同的规则。
最好进行试验并确定而不是希望手册或网页是完整和正确的。
关于你的标题问题,这又是一个非常模糊的问题,是的,那里有理解八进制、十进制和十六进制(可能还有其他基数,如基数 2)的汇编程序,不一定都在一个工具中,并且不限于 x86因为标题问题没有。它们的默认值和指定基础所需的语法是特定于每个工具的。重点是汇编语言不像其他编程语言,不能对汇编语言进行概括。对于某些人来说,为一些不符合一般化的目标创建一个新的汇编器会很简单,但却是一个非常有用的工具。
如果我的问题听起来很荒谬,请原谅我。
但是我很迷茫,说我定义的是常量buffer_size
我正在研究的代码中有一行内容是:buffer_size equ 16
,在我看来,这意味着,使 buffer_size
16 变大。但在我查看的其他代码示例中,数字旁边确实有字符 h
,我被告知这是告诉汇编程序将数字视为十六进制。
如果一个数字旁边没有 h
,那么它会变成十进制吗?
是的,MASM(以及几乎所有其他现代汇编程序1)就像C/C++:默认情况下数字文字是十进制的.
您可以使用带后缀的其他碱基。有关语法,请参阅 How to represent hex value such as FFFFFFBB in x86 inline assembly programming?。一些汇编程序,如 NASM,允许 0x123
以及 123h
,但 MASM 仅 允许后缀。
10h
与 C 中的 0x10
完全相同,并且完全等同于 16
.
汇编的机器代码不依赖于数字的源表示。 (mov eax, 10h
是5个字节:操作码,然后是32位小端二进制数,与mov eax, 16
相同。)
foo: db 0FFh
也是如此:向其添加内容的代码不是 "adding hex numbers",它只是一个普通的二进制数。 (一个常见的初学者错误(在术语或理解上,通常不清楚是哪个)是将源代码表示与机器在运行汇编程序输出时正在做的事情混淆。
脚注 1:古代汇编程序可能有所不同。可能有一些非 x86 平台的汇编程序也不默认为十进制。
过时的 DOS DEBUG.EXE 内置的一个将所有数字文字视为十六进制,因此 mov ax, 10
= mov ax, 8+8
。 (如果它甚至计算常量表达式,但如果不是那么你明白我的意思。)
DEBUG.EXE 甚至不支持标签,所以以现代标准来看它基本上是可怕的;不要使用它。现在有像 NASM 这样的免费开源汇编器,也有调试器,至少包括 BOCHS 内置的一个,所以没有必要为旧工具所苦。
无论如何,这个关于 DEBUG.EXE 的旁路与你关于 MASM 的问题并不相关;我只是将它作为我所知道的不默认为十进制的汇编程序的唯一示例。它们确实存在,但现在不正常。
小心,要知道汇编语言通常不像许多高级语言那样标准化,所以问题很模糊,你甚至没有说明指令集。标签 masm32 暗示 x86(该标签是为您添加的)。
您似乎想要 x86 和 masm 汇编程序家族的特定子集。
汇编一般是由汇编器、工具定义的,不是指令集。因此,当想了解汇编语言的工作原理或其规则时,您必须查看汇编程序本身。它的文档如果有或者足够好,如果没有你必须试验。
我手边没有 masm32,需要一些努力才能得到它,但我有另一个现成的汇编程序,您可以通过实验回答您自己的问题。 (正如在另一个答案中已经指出的那样,是的,如果 masm 中没有 h,它默认为十进制)
mov al,10h
mov al,0x10
mov al,10
反汇编为
00000000 B010 mov al,0x10
00000002 B010 mov al,0x10
00000004 B00A mov al,0xa
在这种情况下,未指定意味着默认为十进制,这是您至少应该期望来自 masm 的指令。
Non-instruction 语法也是汇编语言的一部分,其语法规则可能与该语言的指令部分不同。人们希望一种工具始终对数字使用相同的规则,但你永远不知道。
同样,可能有一些指令使用立即数作为寄存器的偏移量,而不是将值加载到寄存器中,希望那些 immediates/values 也遵循相同的规则。
最好进行试验并确定而不是希望手册或网页是完整和正确的。
关于你的标题问题,这又是一个非常模糊的问题,是的,那里有理解八进制、十进制和十六进制(可能还有其他基数,如基数 2)的汇编程序,不一定都在一个工具中,并且不限于 x86因为标题问题没有。它们的默认值和指定基础所需的语法是特定于每个工具的。重点是汇编语言不像其他编程语言,不能对汇编语言进行概括。对于某些人来说,为一些不符合一般化的目标创建一个新的汇编器会很简单,但却是一个非常有用的工具。