gpt4 book ai didi

assembly - cmp汇编语言指令-gas格式

转载 作者:行者123 更新时间:2023-12-02 21:39:16 25 4
gpt4 key购买 nike

我正在将 32 位和 64 位汇编语言文件从 Gas 格式转换为 MASM 格式,并在我的代码中遇到了一条似乎完全有问题的指令。我的意思是,我认为汇编器无法知道操作数的大小,无论指令是从内存中获取 8、16、32 还是 64 位来执行比较。这是说明:

  • cmp $0, 8(%rsp)

如果指令是以下之一,汇编器可以根据寄存器计算出要获取和比较的内存操作数的大小:

  • cmp %rax, 8(%rsp)
  • cmp %eax, 8(%rsp)
  • cmp %ax, 8(%rsp)

我本以为指令需要是 cmpb、cmpw、cmpl、cmpq...但是不,我的程序只用 cmp 指令就可以很好地组装它。不幸的是,我不记得这段代码在做什么,而且它非常不明显......所以解决这个问题的更简单的方法是知道指令在做什么。

有人知道吗?任何人都明白为什么这种语法(未指定操作数大小/类型)甚至可以与立即操作数一起使用?

最佳答案

它必须有某种默认值。我在我的机器上尝试过,上面写着 as 是:

Apple Inc version cctools-836, GNU assembler version 1.38

我得到了这些结果:

$ cat example.s 
cmp $0, 8(%rsp)
$ make example.o
as -o example.o example.s
$ otool -tV example.o
example.o:
(__TEXT,__text) section
0000000000000000 cmpl $0x00,0x08(%rsp)

所以在我的机器上,它选择了cmpl。使用 gcc 而不是 as 给了我相同的结果,但使用 clang 产生了您期望的错误:

$ clang -c example.s 
example.s:1:2: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
cmp $0, 8(%rsp)
^

关于assembly - cmp汇编语言指令-gas格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com