assembly - 什么时候需要在 Assembly 中指定操作数的大小?
问题描述
我刚开始在大学学习大会(x86,NASM),我真的很困惑它是如何工作的。在我有很多关于它的问题中,这一直困扰着我。
什么时候需要指定操作数的大小?有规律吗?例如:
segment data use32 class=data
a db 10
b dw 40
segment code use32 class=code
start:
mov AX, [b]
div BYTE [a]
这里我们将操作div
码中操作数的大小指定为BYTE
. 如果我删除那BYTE
部分,我会得到一个错误,所以我们需要指定它。
segment data use32 class=data
a db 10
b dw 40
segment code use32 class=code
start:
mov AH, 2
mul AH
在这里,我们不需要指定操作数的大小2
。它只是工作。
那么我什么时候必须指定尺寸?是不是很简单:当我在内存中声明了一个变量时,指定它的大小?考虑到上面给出的例子,我倾向于这样认为,但是通过我对 Assembly 的短暂经验,我发现它倾向于违背我关于事情应该如何工作的逻辑。
另外,在告诉我什么时候需要指定尺寸之后,你能告诉我为什么我们需要这样做吗?当我们需要这样做时,我们为什么需要这样做?我的意思是,我们已经声明了变量,所以变量的类型应该对程序可见,不是吗?为什么我们需要指定大小,否则会出错?
解决方案
如果可以从您指定的其他内容中推断出操作数大小,则无需指定操作数大小。例如,mov
只对两个相同大小的操作数起作用,并且AX
是一个字大小的寄存器,所以在 中mov AX, [b]
,它可以推断出[b]
必须是字大小的。但是您只为 指定一个操作数div
,因此您必须告诉它大小[a]
是多少,因为它没有任何信息可以从中推断出它。
推荐阅读
- python - Python noob:为游戏创建 D&D 风格的角色
- r - 在新 R 版本中编译用旧版本编写的代码时出现问题
- triggers - 通过 SSMS 更新表时的更新触发器
- rust - 是否有评估可反驳模式是否匹配的简写?
- javascript - if 语句在单击按钮时检查活动类
- linux - 构建最小操作系统时出现“firmware-atheros”网络 debian 软件包问题
- arrays - Mongodb:如何转换嵌套对象数组中的字段
- reactjs - 从功能性 React 组件传递 AgGrid 上下文
- c# - 如何在 automapper 中为 aftermap 上的目标属性赋值
- wordpress - ACF 中继器 - 显示前 10 行并将其他行放在另一个 div