【问题标题】:x86 yasm, segfault on cmpsb; proper usage of cmpsb?x86 yasm,cmpsb 上的段错误; cmpsb的正确使用?
【发布时间】:2013-02-10 03:59:22
【问题描述】:

我正在用 yasm 编写冒泡排序的开头,作为练习。但是我每次都在下面的最后一条指令中出现段错误,我不明白为什么。

    segment .data

arr     db      5,6,2,3,8,1

    segment .text
    global  main 
main:   
    xor ecx, ecx                ; counter
    mov rdx, 6                  ; sizeof(arr)
    cld

_Do:    xor eax, eax            ; set swapped = false

for:
    movzx esi, byte [arr+ecx]
    movzx edi, byte [arr+ecx+1]
    cmpsb                       ; is a[i]>a[i+1]? <--- segfault here every time
    ;jump to swap next, if I could get there

我的理解是 cmpsb 比较的是 si 和 di 中的字节。为什么要发生段错误?这对我来说一定是非常简单的错误,但我没有看到。通常 cmpsb 用于重复的上下文中,但我认为它也可以在这里工作。谢谢你的帮助!

【问题讨论】:

    标签: assembly x86 yasm


    【解决方案1】:

    CMPSB 不比较两个寄存器的内容——这就是正常的CMP 的用途。相反,它将寄存器视为地址并比较它们指向的两个值。尝试类似:

    lea esi, byte [arr + ecx]
    lea edi, byte [arr + ecx + 1]
    cmpsb
    

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2012-05-20
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多