【问题标题】:What's the difference between `add al, 0` and `add al, '0'`?`add al, 0` 和 `add al, '0'` 有什么区别?
【发布时间】:2018-01-04 19:55:33
【问题描述】:

所以我一直在阅读一些汇编代码以供学习,并且遇到了这两个说明:

add    register, value
add    register, 'value'     ; Where the value is now in single quotes

两者有什么区别?

如果这恰好是重复的,在我被激怒之前。我在这里问过,因为我不知道谷歌到底要什么来回答这个问题。

【问题讨论】:

  • value 是实际值。 'value' 是一个代表 ASCII 值的字符(在您的帖子中,“值”我假设您的意思是一个数字)。所以0 为零。 '0' 是 0x30 的值(字符 '0' 的 ASCII 值)。
  • 你试过用objdump看看有什么区别吗?
  • @lurker - 啊,我假设了。只是想更加确定。谢谢:)
  • 语法信息的最佳来源是(通常)使用的汇编文档,例如NASM 允许三种“引号”方式:'0' "0" `0` - 单引号和双引号是一样的,封闭字符串(即'0123' 将被编译为字节值48 49 50 51),反引号类似,但也会解析类似C 的元字符,即`\n` 将编译为值10。其他汇编程序的语法可能差异很大。 (如果不确定,请使用 objdump 检查生成的机器代码或使用汇编程序中的列表文件)

标签: assembly instructions


【解决方案1】:

根据汇编程序的不同,将字符括在单引号中可能会要求编译器使用该字符的 ASCII 码,对于数字零,十进制的 48 或十六进制的 0x30。我猜这就是这里的意图。其他汇编器使用单引号作为语法的一部分来指定不同基数的值(例如,h'A5' 表示十六进制值 0xA5);我不确定使用这种表示法的汇编程序是否会将不带前缀的引号中的值解释为:

  1. 默认基数中的数字
  2. 一个以十为底的数字,即使默认值是其他值
  3. 字符代码,或
  4. 语法错误

这些解释中的任何一个似乎都是合理的,如果某个地方有某种汇编程序可以以每种方式处理它,我不会感到非常惊讶。

我猜代码的意图最有可能采用数字零的 ASCII 值,周围的指令可能会清楚地说明这一点,但如果没有看到上下文,我无法确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2011-01-12
    • 2010-12-13
    • 2013-02-07
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多