我想将字符串的结尾字符与句点进行比较。
我计算了字符串的长度,并将其保存在名为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
答案 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], '.'