程序集是否理解非十六进制的数字?

时间:2018-09-03 02:11:37

标签: assembly x86 masm32

如果我的问题听起来很荒谬,请原谅我。

但是我很困惑,说我在定义常量buffer_size 我正在研究的代码上有一行写着:buffer_size equ 16,在我看来,这意味着将buffer_size变大16。但是在我查看的其他代码示例中,数字旁边确实有字符h,我被告知要告诉汇编程序将数字视为十六进制。

如果数字旁边没有h,那么它会变成小数吗?

2 个答案:

答案 0 :(得分:3)

是的,MASM(以及几乎所有其他现代汇编程序 1 )就像C / C ++:数字文字默认情况下为十进制

您可以将其他基数与后缀一起使用。有关语法,请参见How to represent hex value such as FFFFFFBB in x86 inline assembly programming?。某些汇编程序(例如NASM)既允许0x123也允许123h,但是MASM only 允许后缀。

MASM中的

10h与C语言中的0x10完全相同,并且完全等效于16

汇编的机器代码不依赖于数字的源表示形式。 ({mov eax, 10h是5个字节:操作码,然后是32位的Little-Endian二进制数字,与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的问题并不十分相关;我仅将其作为唯一已知的不默认为十进制的汇编程序示例来提及。它们确实存在,但是最近这并不正常。

答案 1 :(得分:3)

请注意,请理解汇编语言通常不像许多高级语言那样标准化,因此问题非常模糊,您甚至没有说明指令集。标记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指令来说应该如此。

也是汇编语言一部分的非指令语法可能具有与语言的指令部分不同的语法规则。人们希望一种工具对整个数字使用相同的规则,但是您永远不会知道。

同样,可能有一些指令使用立即数作为寄存器的偏移量,而不是将值加载到寄存器中,人们希望这些立即数/值也遵循相同的规则。

最好进行试验,并确保而不是希望手册或网页完整且正确。

对于您的标题问题,这个问题又仍然很模糊,是的,那里有汇编程序可以理解八进制,十进制和十六进制(可能还有其他基数,例如基数2),而不必全部都在一个工具中,并且不限于x86,因为标题问题没有。它们的默认值以及指定基数所需的语法特定于每个工具。要点是汇编语言与其他编程语言不同,无法对汇编语言进行概括。对于某人来说,为不符合一般性的目标创建新的汇编程序将是简单的,但却是一个完美可用的工具。