Assembly 程序集是否理解非十六进制的数字?
如果我的问题听起来很荒谬,请原谅 但是我很困惑,比如说我正在定义常量Assembly 程序集是否理解非十六进制的数字?,assembly,x86,hex,masm32,Assembly,X86,Hex,Masm32,如果我的问题听起来很荒谬,请原谅 但是我很困惑,比如说我正在定义常量缓冲区大小 我正在研究的代码中有一行写着:buffer\u size equal 16,在我看来,这意味着要把buffer\u size16变大。但在我回顾的其他代码示例中,数字旁边确实有字符h,我被告知这是告诉汇编程序将数字视为十六进制 如果一个数字旁边没有h,那么它是十进制的吗?是的,MASM(以及几乎所有其他现代汇编程序1)与C/C++类似:默认情况下,数字文字是十进制的 您可以使用其他带后缀的基。有关语法,请参见。一些汇
缓冲区大小
我正在研究的代码中有一行写着:buffer\u size equal 16
,在我看来,这意味着要把buffer\u size
16变大。但在我回顾的其他代码示例中,数字旁边确实有字符h
,我被告知这是告诉汇编程序将数字视为十六进制
如果一个数字旁边没有h
,那么它是十进制的吗?是的,MASM(以及几乎所有其他现代汇编程序1)与C/C++类似:默认情况下,数字文字是十进制的
您可以使用其他带后缀的基。有关语法,请参见。一些汇编器,如NASM,允许0x123
以及123h
,但MASM只允许后缀
MASM中的10h
与C中的0x10
完全相同,并且完全等同于16
汇编的机器代码不依赖于数字的源表示形式。(mov-eax,10h
是5个字节:操作码,然后是32位低位二进制数,与mov-eax,16
相同)
这同样适用于foo:db 0FFh
:添加内容的代码不是“添加十六进制数”,它只是一个普通的二进制数。(初学者的一个常见错误(在术语或理解上,通常不清楚是哪一个)是将源代码表示与机器在运行汇编程序输出时所做的操作相混淆
脚注1:古老的汇编程序可能不同。对于一些非x86平台,可能有一些汇编程序也不默认为十进制
已过时的DOS DEBUG.EXE中内置的一个将所有数字文本视为十六进制,因此mov-ax,10
=mov-ax,8+8
(如果它甚至计算常量表达式,但如果不是,那么你知道我的意思。)
DEBUG.EXE甚至不支持标签,所以按照现代标准,它基本上是可怕的;不要使用它。现在有像NASM这样的免费开源汇编程序,还有至少一个内置到BOCHS的调试器,所以没有必要使用旧工具
无论如何,这个关于DEBUG.EXE的旁白与您关于MASM的问题并不相关;我只提到它是我所知道的唯一一个不默认为十进制的汇编器的例子。它们确实存在,但现在已经不正常了。是的,MASM(以及几乎所有其他现代汇编器1)与C/C++类似:默认情况下,数字文字是十进制的
您可以将其他基与后缀一起使用。有关语法,请参阅。某些汇编器(如NASM)允许0x123
以及123h
,但MASM只允许后缀
MASM中的10h
与C中的0x10
完全相同,并且完全等同于16
汇编的机器代码不依赖于数字的源表示形式。(mov-eax,10h
是5个字节:操作码,然后是32位小端二进制数,与mov-eax,16
相同)
这同样适用于foo:db 0FFh
:向其添加内容的代码不是“添加十六进制数”,它只是一个普通的二进制数。(一个常见的初学者错误(在术语或理解上,通常不清楚是哪个错误)是将源代码表示与机器在运行汇编程序输出时所做的操作相混淆
脚注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,它默认为十进制)
分解成
00000000 B010 mov al,0x10
00000002 B010 mov al,0x10
00000004 B00A mov al,0xa
在这种情况下,“未指定”意味着默认值为十进制,这至少是masm指令的预期值
非指令语法也是汇编语言的一部分,它可能与语言的指令部分有不同的语法规则。人们希望一个工具对数字使用相同的规则,但你永远不知道
同样,也可能有指令将立即数用作寄存器的偏移量,而不是将值加载到寄存器中,我们希望这些立即数/值也遵循相同的规则
最好是进行实验并确信,而不是希望
00000000 B010 mov al,0x10
00000002 B010 mov al,0x10
00000004 B00A mov al,0xa