标签: x86-64

10个字符ID,全局和本地唯一

我需要生成一个10个字符的唯一ID(SIP/VOIP人员需要知道它是P-Charging-Vector头中的param icid值).每个字符应为26个ASCII字母之一(区分大小写),10个ASCII数字之一或连字符减号.

它必须是"全局唯一的(在生成id的机器之外)"并且足够"本地唯一(在生成id的机器内)",并且所有需要打包成10个字符,p!

这是我的看法.我是第一个编码'必须'编码全局唯一本地IP地址到base-63(它是一个无符号长整数,编码后将占用1-6个字符)然后尽可能多的当前时间戳(其一个time_t/long long int,编码后将占用9-4个字符,具体取决于编码的ip地址占用的空间大小.

我还在时间戳中添加了循环计数'i',以便在一秒钟内多次调用该函数时保留唯一性.

这是否足以在全球和本地独特,还是有另一种更好的方法?

拉夫

#include <stdio.h>
#include <string.h>
#include <sys/time.h>

//base-63 character set
static char set[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";

// b63() returns the next vacant location in char array x
int b63(long long longlong,char *x,int index){
    if(index > 9)
        return index+1;

    //printf("index=%d,longlong=%lld,longlong%63=%lld\n",index,longlong,longlong%63);
    if(longlong < 63){
        x[index] = set[longlong];
        return index+1;
    }  

    x[index] = set[longlong%63];
    return b63(longlong/63,x,index+1);
}

int main(){
    char x[11],y[11] = {0}; /* '\0' is taken care of here */

    //let's generate 10 million ids
    for(int i=0; …
Run Code Online (Sandbox Code Playgroud)

c c++ linux x86-64 sip

0
推荐指数
1
解决办法
1537
查看次数

如何在x86进程中从x64进程中查找user32.dll函数地址?

如何在x86进程中从x64进程中查找user32.dll函数地址?

编辑:我的意思是我的程序运行x64,我搜索x86地址.

64-bit x86 winapi x86-64 getprocaddress

0
推荐指数
1
解决办法
606
查看次数

AMD64在i586上运行,反之亦然?

我有一个小型的C程序,我希望从Linux移植到Windows.我可以用MinGW编译器做到这一点,我注意到它有两个不同的前缀,amd64和i586.我在i686计算机上,我想知道我是否使用和amd64架构编译我的C程序,它会在我的i686机器上运行吗?反之亦然?
更新:
是否有编译器编译C代码以在任何架构上运行?

c x86-64 cpu-architecture

0
推荐指数
1
解决办法
4026
查看次数

int32 len = va_args(va,int32)在x86_64 GNU/Linux上给出了非常大的值

void AppBuf(message_id_type msgID, int32 numPairs, va_list va)

{
int32 len = va_args(va, int32);
....
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在windows(32位和64位)以及linux 32位编译器上运行得非常好.对于以上所有,'len'的值为10.

但是在linux 64位(x86_64 GNU/Linux)上,我得到了一个非常大的值len(50462976),这会使代码的其余部分混乱并在崩溃中结束.

我曾经读过linux 64位编译器中的某些内容已经发生了变化,va_lists但我无法理解这一变化,所以我无法解决我的问题.

有人可以帮我解决这个问题吗?

谢谢.

晴朗

好的,以下是导致这一点的整个代码的详细信息:有人可以帮忙吗?提前致谢.

调用堆栈:

AppendBuffers(int msgID = 0x00000001,int numPairs = 0x00000001,char*va = 0x0007fcb0){注意:这是上面提到的问题所在(长度=非常大)}

LogMsg(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)

LogMsgBuffersV(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)

LogMsgBuffersV(int msgID = 0x00000001,int numPairs = 0x00000001,char*arguments = 0x0007fcb0)

LogMsgBuffers(int msgID = 0x00000001,int numPairs = 0x00000001,...)

实际代码:

void LogMsgBuffers(message_id_type …
Run Code Online (Sandbox Code Playgroud)

c++ linux x86-64 variadic-functions

0
推荐指数
1
解决办法
395
查看次数

x86-64上最快的方法来检查指针范围是否跨越N字节对齐的地址?

给定一个指向T的指针,我想确定T是否跨越N字节对齐的地址.在实践中我真的只关心0-5字节大小的对象是否跨越8或16字节字节边界,但我写了这个通用版本:

template<class T, unsigned long N>
bool straddlesBoundary(T* obj)
{
    unsigned long before = (unsigned long)obj & ~(N-1);
    unsigned long after  = ((unsigned long)obj + sizeof(T) - 1) & ~(N-1);
    return before != after;
}
Run Code Online (Sandbox Code Playgroud)

基本上,将地址向下舍入到最接近的N字节对齐地址,然后将指针增量乘以T的大小减1(因为T在下一个边界上的右边不算作跨骑)并将其向下舍入到最近N字节对齐的地址,如果匹配,则表示它不会跨越.

有更快的方法吗?我刚刚做了这个,我不知道是否有标准检查.

编辑:注意,我假设T小于N.

c++ bit-manipulation x86-64 simd alignment

0
推荐指数
1
解决办法
456
查看次数

简单的x86-64 C++内联汇编"Hello World"示例

我试图找到一个非常基本的C++内联x86-64汇编示例,类似于:

C/C++中的简单"Hello World"内联汇编语言程序

char msg[] = "Hello, world";

asm {
    mov ax,4       // (I/O Func.)
    mov bx,1       // (Output func)  
    lds cx, msg   // (address of the string)
    mov dx,6       //  (lenght of the string)
    int 0x21       // system call
}
Run Code Online (Sandbox Code Playgroud)

哪个适用于英特尔编译器.有人可以帮忙吗?

编辑关于操作系统我在Windows和Linux上有ICC ​​ - 让我们说Linux吧!

c++ linux assembly x86-64 inline-assembly

0
推荐指数
1
解决办法
5050
查看次数

Delphi XE3中的64位内联汇编

我在Delphi XE3中使用64位内联汇编程序遇到了这个问题,我不明白.

我试过这个,它适用于32位和64位

function test(a, b: integer): integer; assembler; register;
asm
  mov eax, a
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于32位而不是64位,在64位编译时,但没有返回两个整数之和的正确结果.

function test(a, b: integer): integer; assembler; register;
asm
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

我知道以前的FPU代码如FLD,STP工作在32位但它会在64位编译器上产生编译错误.知道如何处理64位浮点数吗?

delphi 64-bit assembly x86-64 basm

0
推荐指数
1
解决办法
1444
查看次数

x86_64相对jmp操作数

我无法理解操作数如何FE FC FF FF导致0x9e7080.

我尝试了一些数学子/添加到当前地址,因为它应该是相对跳转,但结果仍然不等于0x9e7080.

instruction address | bytes | text form

L_009E737D | E9 FE FC FF FF | jmp 0x9e7080
Run Code Online (Sandbox Code Playgroud)

assembly x86-64

0
推荐指数
1
解决办法
406
查看次数

ld:在标头中定义全局变量时,体系结构x86_64的符号重复

如何解决这个问题呢?

刚得到以下错误:

g ++输出:

duplicate symbol _game in:
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Game-a5a31d.o
duplicate symbol _game in:
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Write-83f8ee.o
Run Code Online (Sandbox Code Playgroud)

看来问题不在头文件中。

编辑:头文件看起来像这样:

#ifndef GAME_H
#define GAME_H
#include "Color.h"
#include "Tile.h"

class Game
{
  public:

    Game();
    ~Game();
    Color getActivePlayer();
    void setStarttile(Tile Firststarttile);
    Color togglePlayer();
    void setRunning(bool run);
    char newActiveplayer;
    void run();
    void runsecondmethod();

  private:
    Game(const Game &);
    Color Activeplayer;
    Tile *Starttile;
    bool Running;
}game;

#endif
Run Code Online (Sandbox Code Playgroud)

c++ macos symbols x86-64 duplicates

0
推荐指数
1
解决办法
1438
查看次数

汇编 - lea和算术

语境:

  • 部件
  • 加油站
  • x86_64的

我的装配有点生疏,我试着让它再次变好.

显示意图的C代码:

void ask_me(int * data){

    (*data)++;

}
Run Code Online (Sandbox Code Playgroud)

这是故意的愚蠢,但适合上下文.

我的工作大会:

_ask_me:
   addq $1, (%rdi)
   ret
Run Code Online (Sandbox Code Playgroud)

题:

我想用这个lea指令作为训练.但我无法使其发挥作用:

_ask_me:
    leaq 1(%rdi), %rdi

    ret
Run Code Online (Sandbox Code Playgroud)

最差:

_ask_me:
    movq (%rdi), %rcx
    leaq 1(%rcx), %rdi

    ret
Run Code Online (Sandbox Code Playgroud)

你能提醒我怎么做吗?

谢谢

assembly x86-64 pointer-arithmetic att

0
推荐指数
1
解决办法
2804
查看次数