汇编:使用“ .equ”并减去2个字符文字后得出无效的操作数错误

时间:2019-04-28 04:14:14

标签: assembly x86 gas

当我尝试汇编代码时,出现以下汇编错误:

Error: invalid operands (*UND* and *UND* sections) for `-' when setting `UPPER_CONVERSION'

我正在使用以下命令进行组装:

as -32 toupper.s -o toupper.o

我的代码(我指的是this书中的从低到高的转换代码):

.section .text

###CONSTANTS##
#The lower boundary of our search
.equ LOWERCASE_A, ’a’
#The upper boundary of our search
.equ LOWERCASE_Z, ’z’
#Conversion between upper and lower case
.equ UPPER_CONVERSION, ’A’ - ’a’                  ## error on this line

有关使用$UPPER_CONVERSION作为立即数的完整代码,请参见此问题的第一个版本。但是上面的代码是MCVE,它会产生汇编器错误消息,因此不能用作定义UPPER_CONVERSION = 65 - 97 = -32

的方法

我看到了this个问题,我尝试了解决方案,但我认为它没有关系(在这里我可能是错的)。

1 个答案:

答案 0 :(得分:4)

您的源代码中包含一些非ASCII引号
将您的’A’ - ’a’粘贴到GNU / Linux上的hd(也称为hexdump -C)中显示以下内容:

00000000  e2 80 99 41 e2 80 99 20  2d 20 e2 80 99 61 e2 80  |...A... - ...a..|
00000010  99 0a                                             |..|

所以问题是引号是3字节的UTF-8序列,而不是ASCII单引号。

将其重新键入为

.equ UPPER_CONVERSION, 'A' - 'a' 

生成一个可以正常汇编的文件。 (只包含那一行。我没有尝试整个文件。)