如何在Gasm(Gnu汇编程序)中将符号与字符串进行比较?

时间:2013-05-25 14:47:53

标签: linux assembly gnu

我需要使用gasm计算字符串中的空格量。所以,我用简单的程序编写,但比较不起作用。

.section .data
  str:
    .string " TEst   string wit h spaces   \n"

.section .text
.globl _start
_start:

movl $0,%eax # %eax - amount of spaces
movl $0,%ecx # Starting our counter with zero

loop_start:
  cmpl $32,str(,%ecx,1)  # Comparison (this is never true)
  jne sp
  incl %eax # Programm never goes there
  incl %ecx
  jmp loop_start
sp:
  cmpl $0X0A,str(,%ecx,1) #Comparison for the end of string
  je loop_end #Leaving loop if it is the end of string
  incl %ecx
  jmp loop_start
loop_end:
  movl (%eax),%ecx  # Writing amount of spaces to %ecx
  movl $4,%eax
  movl $1,%ebx
  movl $2,%edx
  int $0x80

  movl $1,%eax
  movl $0,%ebx
  int $0x80

所以,这个字符串中的问题cmpl $32,str(,%ecx,1)我尝试比较空间(ASCII中的32)和1字节的str(我使用%ecx作为位移计数器,占用1个字节)。不幸的是,我没有在互联网上找到任何有关Gasm符号比较的例子。我试过使用gcc生成的代码,但我无法理解和使用它。

1 个答案:

答案 0 :(得分:1)

这永远不会回归,我想我知道原因:

cmpl $32,str(,%ecx,1)

因为您正在将立即值与内存地址进行比较,所以汇编程序无法知道这两个操作数的大小。因此,它可能假设每个参数都是32位,但您想要比较两个8位值。您需要某种方式来明确声明您正在比较字节。我的解决方案是:

mov str(,%ecx,1), %dl  # move the byte at (str+offset) into 'dl'
cmp $32, %dl           # compare the byte 32 with the byte 'dl'.
# hooray, now we're comparing the two bytes!

可能有一种更好的方法来显式比较字节,我可能在某处犯了一个愚蠢的错误;我不太熟悉AT& T语法。但是,你应该了解你的问题是什么,以及如何解决它。