汇编是否理解非十六进制的数字?

问题描述 投票:0回答:2

如果我的问题听起来毫无意义,请原谅我。

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

如果一个数字旁边没有h,它会使它成为小数吗?

assembly x86 masm32
2个回答
3
投票

是的,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:添加内容的代码不是“添加十六进制数字”,它只是一个普通的二进制数。 (常见的初学者错误(在术语或理解中,通常不清楚哪一个)是将源代码表示与机器在运行汇编器输出时所做的事情混淆。


脚注1:古代装配工可能不同。对于某些非x86平台,可能还有一些汇编程序也不会默认为十进制。

过时的DOS DEBUG.EXE内置的一个将所有数字文字视为十六进制,所以mov ax, 10 = mov ax, 8+8。 (如果它甚至评估常量表达式,但如果没有,那么你就知道我的意思了。)

DEBUG.EXE甚至不支持标签,因此它的现代标准基本上是可怕的;不要使用它。目前有免费的开源组装商,如NASM,还有调试器,至少包括BOCHS内置的调试器,因此不需要使用旧工具。

无论如何,关于DEBUG.EXE的这个侧面跟你关于MASM的问题并不真正相关;我只提到它是我所知道的一个不默认为十进制的汇编程序的唯一例子。它们确实存在,但这些日子并不正常。


3
投票

要小心,要理解汇编语言通常没有像许多更高级语言那样标准化,所以问题很模糊,你甚至没有陈述指令集。标签masm32暗示x86(为您添加了该标签)。

看起来你想要x86和masm系列汇编程序的特定子集。

汇编通常由汇编程序,工具而不是指令集定义。因此,当想要了解汇编语言的工作方式或规则时,您必须查看汇编程序本身。它的文件是否足够好,如果没有,你必须进行实验。

我没有masm32方便,需要一些痛苦来获得它,但我有另一个随时可用的汇编程序,你可以通过实验回答你自己的问题。 (正如在另一个答案中指出的那样,是的,如果没有h在masm中它默认为十进制)

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,因为标题问题确实存在不。它们默认为什么以及指定基数所需的语法是特定于每个工具的。点汇编语言与其他编程语言不同,不能对汇编语言进行概括。对某些人来说,为一些不符合泛化的目标创建一个新的汇编程序会很简单,但却是一个非常有用的工具。

© www.soinside.com 2019 - 2024. All rights reserved.