Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String dw和dd与字符串的db指令有何不同?_String_Assembly_X86_Nasm_Masm - Fatal编程技术网

String dw和dd与字符串的db指令有何不同?

String dw和dd与字符串的db指令有何不同?,string,assembly,x86,nasm,masm,String,Assembly,X86,Nasm,Masm,假设我想在运行汇编程序之前定义一个初始化的变量字符串(在部分.data)。我选择创建的变量名为Digits,它是一个包含所有十六进制符号的字符串 Digits: db "0123456789ABCDEF" 我用db定义了变量,这意味着定义字节。这是否意味着数字变量的长度为8位?这对我来说似乎没有意义,因为: 字符串中的每个字符都是ASCII字符,因此每个字符需要2个字节。总的来说,整个字符串需要32个字节 那么,当我将变量定义为byte时,它意味着什么呢?单词双字?我看不出有什么区别。由于我的

假设我想在运行汇编程序之前定义一个初始化的变量字符串(在
部分.data
)。我选择创建的变量名为
Digits
,它是一个包含所有十六进制符号的字符串

Digits: db "0123456789ABCDEF"
我用
db
定义了变量,这意味着定义字节。这是否意味着
数字
变量的长度为8位?这对我来说似乎没有意义,因为:

字符串中的每个字符都是ASCII字符,因此每个字符需要2个字节。总的来说,整个字符串需要32个字节

那么,当我将变量定义为byte时,它意味着什么呢?单词双字?我看不出有什么区别。由于我的误解,告诉字符串所需的数据类型似乎是多余的

PD:没有帮助我理解。

NASM回答,MASM完全不同 链接问题的其中一个答案引用了NASM手册中的示例,确实回答了您的问题。根据要求,我将对这三种情况进行扩展(并更正小写与大写ASCII编码错误!):

因此,不同之处在于,当您使用
dd
dw
而不是
db
时,会以零填充元素大小的倍数

根据,一些汇编器可能对
dd
dw
字符串常量使用不同的字节顺序。在NASM语法中,字符串在内存中的存储顺序始终与在带引号的常量中显示的顺序相同

您可以将其与NASM组合(例如,组合到默认的平面二进制输出中),并使用
hextump-C
或其他方法来确认字节顺序和填充量


请注意,元素大小的填充适用于每个逗号分隔的元素。因此,看似无辜的
dd'%lf',10,0
实际上是这样组合的:

;dd   '%lf',    10,        0
db    '%lf',0,  10,0,0,0,  0,0,0,0        ;; equivalent with db
注意换行前的
0
;如果将指向此的指针传递到
printf
,则C字符串就是
%lf”
,以第一个
0
字节终止

write
system call或
fwrite
函数的显式长度将打印整个内容,包括
0
字节,因为这些函数处理的是二进制数据,而不是C隐式长度字符串。)


还要注意,在NASM中,您可以执行类似于
mov-dword[rdi],“abc”
的操作来将“abc\0”存储到内存中。i、 e.多字符文字在NASM的任何上下文中都可以作为数字文字使用


MASM是非常不同的
更多信息,请参阅。即使在
dd“abcd”
中,MASM也会打断字符串,将块内的字节顺序与源顺序相反。

对于字符串“0123456789ABCDEF”中的每个字符,您只需要一个字节。因此,字符串将占用内存中的16个字节

在本声明的情况下:

vark db 1

您可以这样做:

mov[vark],128

而且不能:

mov[vark],1024

但在这种情况下:

vark dw 1


你可以。

我想澄清一下:

example: db 'ABCDE';
这总共保留了5个字节,每个字节包含一个字母

ex2: db 1 ;
保留一个包含1的字节

ex3: db "cool;
保留4个字节,每个字节包含一个字母

ex4: db "cool", 1, 3;
保留3个字节


答案:ex4是6个字节

@JoseManuelAbarcaRodríguez我知道我定义了一个字节变量。如果我定义一个单词变量呢?它是否有16个字长,例如32字节长?这对我来说没有意义。。。我错过了一些东西。所有内容都是由字节构成的,因此不应该所有内容都是字节变量吗?例如:
my_array DW 1,2,3,4
,这个变量包含4个值,每个值有2个字节长,所以变量是8个字节。@JoseManuelAbarcaRodríguez但是对于字符串呢?当我定义字符串时,这就是我的误解所在。不要把它看作是定义变量;您正在为内存位置/分配定义标签。ASCII是8位编码(实际上,经典ASCII仅为7位,0x80以上的代码是特定于平台的,目前常用的ISO-Latin1编码)。所以'0123456789ABCDEF'是16字节,而不是32字节。“Digits:db”在某种程度上等于do
Digits:db'0'
,然后在新行doing
db'1',2',3',…'F'
。(因此“Digits”标签的地址为包含“0”的字节)。
'string'
语法是定义多字节值的快捷方式。OP没有指定MASM,在MASM中,标签后面的指令会神奇地影响引用它的指令的操作数大小。此外,这根本不能回答这个问题,因为这个问题是关于字符串的,而不是像中那样的整数常量,并且说它没有回答他的问题。你能为其他两种情况各举一个例子吗,正如你在评论中所展示的,它是如何与
dw
结合的吗?总之,助记符实际上并没有改变变量的某些内容,只有当它是表时才改变?@PichiWuana:我不是这样描述它的<如果要以单独的字节访问,则使用单独的ALIGN指令的code>db更有意义。而且,
db
只是将字节汇编到输出文件中。变量是一个更高级别的概念,不必将1:1映射到指令或标签。与反转字符串中字节的汇编程序相比,对于A86,两字节
dw
字符串项由汇编程序反转,因此源代码必须包含“向后”字符串。将其放入文件中,进行组装,然后把它倒出来看看你的汇编程序放在那里了。您的上一个示例是错误的,
“酷”,1,3
总共是6个字节。而且,这不是真正的答案。这有点像一个问题,虽然前三个例子都是正确的答案。@PeterCordes是的,我找到了答案。然后请把你的答案给我
ex4: db "cool", 1, 3;