Assembly 有没有一种方法可以将不兼容的指针类型强制转换为c中的不同指针类型?

Assembly 有没有一种方法可以将不兼容的指针类型强制转换为c中的不同指针类型?,assembly,x86-64,Assembly,X86 64,从上一个问题开始,我使用一个指向数组的固定指针,而不是可修改的指针双指针,因此我考虑是否有一种方法可以强制转换,从而从一种类型转换为另一种类型的兼容指针。我不会发布源代码,因为它可能看起来是重复的,但我关心的是asm解决方案,所以请先查看链接 正如我看到的带有-S标志的编译程序集一样,字符串org在堆栈上传递,从地址-64%rbp开始,然后通过leaq-64%rbp,%rax将该地址传递给函数strsep。所以一切看起来都很好。下面是asm代码片段: main: pushq %rbp

从上一个问题开始,我使用一个指向数组的固定指针,而不是可修改的指针双指针,因此我考虑是否有一种方法可以强制转换,从而从一种类型转换为另一种类型的兼容指针。我不会发布源代码,因为它可能看起来是重复的,但我关心的是asm解决方案,所以请先查看链接

正如我看到的带有-S标志的编译程序集一样,字符串org在堆栈上传递,从地址-64%rbp开始,然后通过leaq-64%rbp,%rax将该地址传递给函数strsep。所以一切看起来都很好。下面是asm代码片段:

main:
    pushq   %rbp    #
    movq    %rsp, %rbp  #,
    subq    $64, %rsp   #,
# a.c:6:     char *token, org[] = "Cats,Dogs,Mice,,,Dwarves,Elves:High,Elves:Wood";
    movabsq $7453250866027716931, %rax  #, tmp93
    movabsq $3183030514286931059, %rdx  #,
    movq    %rax, -64(%rbp) # tmp93, org
    movq    %rdx, -56(%rbp) #, org
    movabsq $8315182520643044396, %rax  #, tmp94
    movabsq $5204599198995727660, %rdx  #,
    movq    %rax, -48(%rbp) # tmp94, org
    movq    %rdx, -40(%rbp) #, org
    movabsq $7311150089436161897, %rax  #, tmp95
    movq    %rax, -32(%rbp) # tmp95, org
    movl    $1867987571, -24(%rbp)  #, org
    movw    $25711, -20(%rbp)   #, org
    movb    $0, -18(%rbp)   #, org
# a.c:7:     while((token=strsep((char**)&org,",")))
    jmp .L2 #
.L3:
# a.c:8:         printf("Token: %s\n",token);
    movq    -8(%rbp), %rax  # token, tmp89
    movq    %rax, %rsi  # tmp89,
    leaq    .LC0(%rip), %rdi    #,
    movl    $0, %eax    #,
    call    printf@PLT  #
.L2:
# a.c:7:     while((token=strsep((char**)&org,",")))
    leaq    -64(%rbp), %rax #, tmp90
    leaq    .LC1(%rip), %rsi    #,
    movq    %rax, %rdi  # tmp90,
    call    strsep@PLT  #
    movq    %rax, -8(%rbp)  # tmp91, token
# a.c:7:     while((token=strsep((char**)&org,",")))
    ...
但最终,它得到了sigint。我知道strep需要一个类型char**,一个指针地址,但我给它的地址是-64%rbp,它应该包含相同的内容。那为什么是sigint呢?2.如何正确地将不兼容的指针类型强制转换为其兼容的等价类型

编辑: 这不是同一个问题。在链接中,我询问了c语言的解释。现在我询问asm中的解决方案。这可能看起来有误导性,但我想说的是我不明白。对于那些认为我在问同样的问题的人,我不是。对于asnwere,请首先查看链接,我希望这里的assemblit解决方案

获取char[N]数组的地址将生成char*[N]数组指针。这与字符**非常不同。前者不会创建新的指针变量,这正是您所需要的

请尝试以下操作:

int main(){
    char *token, org[] = "Cats,Dogs,Mice,,,Dwarves,Elves:High,Elves:Wood";
    char *ptr = org;
    while((token=strsep(&ptr,",")))
        printf("Token: %s\n",token);
}

这应该是你想要的。请注意,ptr是通过调用strep修改的。

编写char org[]=。。。作为一个单独的语句,只是为了避免对它是char*org[]的任何可能的混淆,这将需要一个带括号的字符串初始值设定项列表。为了清晰起见,通常最好避免使用C语法的这一特性。e、 g.char组织[]=…;/char*token,*ptr=org;将同一类型的事物的声明组合在一起。他在6小时前问了这个问题。他得到了答案。是的,你说得对,这是一个解决方案,但这已经是我相关问题的解决方案。现在我要问的是如何在这些指针之间进行强制转换,因为正如您从关心类型的程序集中所看到的,地址引用的内存与strep函数希望指针指向指针的内存相同。[程序集不关心类型char*[N]或者char**,它只看到地址--64%rbp在这个例子中,`并接受它。这就是我所要求的。很抱歉,这不是这个问题的答案,没有链接question@P__J__看评论。这不一样question@milanHrabos在C中获取数组的地址类似于类型转换g是一个数组。类型会发生变化,但指针值是相同的。不会为类型转换生成任何代码。无法通过类型转换实现所需的功能,因为您实际上需要一个新的指针变量,该变量可以修改以指向数组。不要再次问相同的问题。不要滥用system@P__J__电子数据交换这不是重复。它涉及相同的问题,但在不同的视图中。修改原始问题。这是正确的方法。我们已经解释过数组不是指针。您不能将其转换为双指针。@P\u J\uuu:正确的方法是修改此问题以更详细地询问asm,而不是从相同的C q开始uestion.lea-64%rbp不是指针的地址,它只是一个指向刚刚存储的字符数据的指针。例如,char*7453250866027716931是STREP将尝试使用的指针值。强制转换只是向编译器说明它指向的内容。这在C对另一个问题的回答中已清楚解释,但OP正在查看当查看asm时,我希望看到的不是实际存在的内容。@PeterCordes那么我可以在asm中修改什么,而不是在c中修改什么以避免sigint?