伪指令db,dw,dd不在乎CPU是谁,只在乎谁是他们的编译器。
伪指令db、dw、dd都可以定义字符串,但最多的是用db来定义字符串,第一个原因是dw、dd定义的字符串到了内存中排序是相反的。如图:
dw我定义了两个字符串'12'和'56',到了内存中为'21'和'65'。
dd我定义了两个字符串'abcd'和'ef',到了内存中为'bcda'和'fe'。
这是什么原因造成的呢??这是因为dw与dd定义的字符串长度超出了1个字节,因此在字符串中的每个元素间就会有一个线性的高低位排序。在字符串'abcd'中,元素按从高位向低位线性排序。在内存中,数据由低位向高位线性排序,因此字符串'abcd'在内存中的顺序是从低位向高位排序的,所以相反。
第二个原因是不同版本编译器对dw与dd定义字符串的指令格式支持不一样。
masm6支持dw定义的字符串元素最多有2个,dd定义的字符串元素最多有4个,超出就会报错。
如图:
masm5支持dw与dd定义的字符串元素最多有2个,但是在内存中dd还是会占4个字节,dw占2个字节。
超出会报错:
综上所述,定义字符串用db是最好的解决方法,首先masm5与masm6对待db定义字符串的指令格式态度都一样,不会有不兼容的情况发生。其次db定义的长度是一个字节,因此不会有高低位的产生,所以db定义的字符串的元素顺序是怎样的在内存中还是怎样的,不是有反序的情况。
masm5与mam6对其他指令也有不兼容的情况,所以写汇编代码还要考虑使用的编译器是否支持指令的格式与写法
如图: