【发布时间】:2021-07-25 05:08:28
【问题描述】:
在 C 中我有以下结构:
typedef struct _Node{
int data;
struct _Node *left;
struct _Node *right;
} Node;
以及以下汇编代码:
.section .text
.global _start
_start:
mov $8, %esi
mov $A, %rdi
call func
movq $60, %rax
movq $0, %rdi
syscall
func:
pushq %rbp
movq %rsp, %rbp
cmp (%rdi), %esi
jne continue
mov $1, %eax
jmp finish
continue:
cmpq $0, 4(%rdi)
je next
pushq %rdi
mov 4(%rdi), %rdi
call func
pop %rdi
cmp $1, %eax
je finish
next:
cmpq $0, 12(%rdi)
je fail
pushq %rid
mov 12(%rdi), %rdi
call func
pop %rdi
cmp $1, %eax
je finish
fail:
mov $0, %rax
finish:
leave
ret
现在尝试用 C 编写它我有一个问题:
__long__ func ( Node *root, __int__ x){
if (root->data == __x__ )
return 1;
if (root->left != null)
if (_____??_____)
return ___ func(root->left, x)____;
if (root->right != null)
return ____func(root->right, x)____;
}
为什么我们有两个 if-if?如果 left 不为 null,则汇编代码使用 left 儿子调用该函数,并且不进行其他条件检查(即 cmp 调用)。
【问题讨论】:
-
为什么要删除之前的问题?这似乎是相同的内容?
-
它包含的图像非常糟糕,导致它失去了注意力@ecm plus 改变了一点
-
@stacker 编辑您的old question 是正确的解决方案。请勿删除和转发。
-
公平地说,这个问题在目前的状态下是有些合理的。它可能不应该被认为是对前一个问题做错事的惩罚/报应。我们真正失去的只是结构缺少
__attribute__((packed))的cmets,以及返回类型。虽然现在我们可以看到它检查子调用的返回值,但我们可以看到它是 32 位类型,所以int或unsigned,而不是bool或long。 (或者如果它是long,那么它正在做(int)func(root->left, x) == 1什么的!)