如何将变量中的值放入寄存器?

时间:2019-02-17 05:44:53

标签: variables assembly x86 nasm

我想将字符串的结尾字符与句点进行比较。

我计算了字符串的长度,并将其保存在名为strlen的变量中。所以我做了cmp [string + strlen],“。”但是它没有用,所以我尝试将strlen移到寄存器中,但是它也没有用。程序崩溃。即时通讯使用x86 32位Windows 10架构

MOV BL, [strlen-1]      ;the length of the string minus 1 so i would end up 
                         in the last character of the string
cmp [string + BL], '.'
JE func1

1 个答案:

答案 0 :(得分:0)

MOV BL, [strlen-1]

这实际上不是在做您认为正在做的事情。它不在strlen - 1中存储bl的值。而是将值存储在strlen - 1中的 地址 bl中。

如果您知道C,那就是两者之间的区别:

byte* strlen = ...;
BL = *strlen - 1;

和:

byte* strlen = ...;
BL = *(strlen - 1);

在汇编符号中,您可以将方括号([...]视为“要引用的地址”,其中“地址”与“内存位置”可以互换-就像C中的指针一样。

如果要从strlen的实际中减去1,则需要先将该值加载到寄存器中,然后再从中减去1。

在C中:

byte* strlen = ...;
bl  = *strlen;
bl -= 1;

正在组装:

movzx ebx, BYTE PTR [strlen]
sub   ebx, 1                     ; (or dec ebx)

BL寄存器现在将包含字符串的长度减去1。因此,您可以执行以下操作:

mov  al, BYTE PTR [startOfString + ebx]      ; al = startOfString[bl]

将字符串中的最后一个字符(从地址startOfString开始)加载到变量al中。

然后,继续进行操作:

cmp  al, '.'

设置标志。或者,就像您最初使用的那样,您可以使用CISC样式的指令,该指令将负载与比较相结合:

cmp  BYTE PTR [startOfString + ebx], '.'