assembly ARM64汇编编程CMP指令未按预期工作

e0uiprwp  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(60)

我不能使cmp在Mac M1上的arm64汇编上工作。我已经尝试了所有方法,但似乎都不起作用。例如,在下面的代码中,cmp应该评估为false,而不是打印,而是打印Hello World。为什么?

.global _start
.align 2


_start: 

    mov x3, #1
    cmp x3, #2
    b.eq _print_me
    

_print_me:  
    adr x1, _helloworld 
    mov x2, #15
    mov x16, #4
    svc 0
    b _terminate

_helloworld: .ascii "Hello World\n"

_terminate:
    mov x0, #0
    mov x16, #1
    svc 0

字符串
我试过换寄存器……同样的想法。我没有解决方案。我是新来的组装。谢谢
编辑2:为什么有两个标签是打印两个而不是一个?

.global _start
.align 2


_start: 

    mov x3, #1

    cmp x3, #1
    b.eq _print_me


    b _terminate
    

_print_me:  

    adr x1, _helloworld 
    mov x2, #30
    mov x16, #4
    svc 0
    b _terminate
    

_print_me2: 
    adr x1, _helloworld2
    mov x2, #30
    mov x16, #4
    svc 0

    b _terminate

_terminate:
    mov x0, #0
    mov x16, #1
    svc #0x80

_helloworld: .ascii "Hello World\n"
_helloworld2: .ascii "Hello World2\n"

brvekthn

brvekthn1#

@fuz已经在注解中回答了你的第一个例子:当CPU * 不 * 执行分支时,它会继续执行下一条指令。所以分支本质上是无用的。
如果你在反汇编器中看第二个例子,问题就变得很明显了。特别是目标字符串。我在这里使用radare 2:

[0x100003f48]> x 30 @sym._helloworld
- offset -   8C8D 8E8F 9091 9293 9495 9697 9899 9A9B  CDEF0123456789AB
0x100003f8c  4865 6c6c 6f20 576f 726c 640a 4865 6c6c  Hello World.Hell
0x100003f9c  6f20 576f 726c 6432 0a00 0000 0100       o World2......

字符串
两个字符串在内存中是一个接一个的,你指定的30字节长度跨越了两个字符串,然后是一些字节。正确的长度应该是第一个字符串12,第二个字符串13。
这里值得一提的是,在处理C API时,您还应该使用.asciz而不是.ascii来获得字符串零终止,但这在这里没有区别,因为您正在对文件描述符进行原始写入。

相关问题