我不能使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"
型
1条答案
按热度按时间brvekthn1#
@fuz已经在注解中回答了你的第一个例子:当CPU * 不 * 执行分支时,它会继续执行下一条指令。所以分支本质上是无用的。
如果你在反汇编器中看第二个例子,问题就变得很明显了。特别是目标字符串。我在这里使用radare 2:
字符串
两个字符串在内存中是一个接一个的,你指定的30字节长度跨越了两个字符串,然后是一些字节。正确的长度应该是第一个字符串12,第二个字符串13。
这里值得一提的是,在处理C API时,您还应该使用
.asciz
而不是.ascii
来获得字符串零终止,但这在这里没有区别,因为您正在对文件描述符进行原始写入。