0
var1 db 20
;--------code 1-------
lea bx, var1
mov byte ptr[bx],40
;--------code 2-------
lea bx,var1
mov [bx], 40
这是否都是有效的?和相同?如果是,那么为什么我们使用字节ptr?这两个代码会做同样的事情吗?
var1 db 20
;--------code 1-------
lea bx, var1
mov byte ptr[bx],40
;--------code 2-------
lea bx,var1
mov [bx], 40
这是否都是有效的?和相同?如果是,那么为什么我们使用字节ptr?这两个代码会做同样的事情吗?
不,他们不是。
第一段代码包含大小说明符:byte ptr
。没有这个,没有什么可以给汇编提供关于源和目的地的大小的暗示。虽然你可能找到一些情况下(各种指令控制代码的总体组装),他们执行相同的方式,这是不能依赖。
可能看起来不明确的是,您可以将其写为mov var1, 40
而没有大小说明符。但是,如果您要拆解生成的代码,则会发现汇编程序使用var1 db
行中的提示来处理场景背后的事务,这表明这是一个字节而不是单词,双字等。在其他字汇,汇编器实际上会产生:
mov byte ptr [var1], 40
_“如果我们想改变字节,我们可以采取bl”_你的意思是'mov [bl],40'?这是无效的,即使它不具有相同的含义。 – Michael
_“这两个代码是否会做同样的事情?”_组装它,看看会发生什么。一些装配商可能会把它们对待,有些则可能不会。直接40的大小是未知的,这就是为什么使用'byte ptr'的原因。 – Michael
使用'byte ptr'明确地说要移动一个* byte *,否则汇编器必须推导出被移动数据的大小,它可能会假设大小错误(如一个字,16位),这将在你的情况下是错误的。 –