相关疑难解决方法(0)

如何用汇编语言检查EIP值?

我想用汇编语言获取EIP寄存器的当前值.那可能吗?

x86 assembly

34
推荐指数
3
解决办法
3万
查看次数

英特尔8086汇编中CS和IP寄存器的用途是什么?

因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么

我找到了这个解释:

代码段(CS)是一个16位寄存器,包含带有处理器指令的64 KB段的地址.处理器使用CS段来访问指令指针(IP)寄存器引用的指令.CS寄存器不能直接更改.CS寄存器在远跳,远程调用和远程返回指令期间自动更新.

这对于IP:

指令指针(IP)是一个16位寄存器.

我真的不明白这基本上意味着什么,所以如果有人能提供更"生动"的解释,那就太棒了:)

x86 intel x86-16

22
推荐指数
3
解决办法
5万
查看次数

x86-64 Linux中不再允许32位绝对地址?

64位Linux默认使用小内存模型,它将所有代码和静态数据置于2GB地址限制之下.这可确保您可以使用32位绝对地址.较旧版本的gcc使用静态数组的32位绝对地址,以便为相对地址计算保存额外的指令.但是,这不再有效.如果我尝试在汇编中创建一个32位的绝对地址,我会收到链接器错误:"在创建共享对象时,不能使用".data"重定位R_X86_64_32S;使用-fPIC重新编译".当然,此错误消息具有误导性,因为我没有创建共享对象,-fPIC也没有帮助.到目前为止我发现的是:gcc版本4.8.5对静态数组使用32位绝对地址,gcc版本6.3.0不使用.版本5可能也没有.binutils 2.24中的链接器允许32位绝对地址,而2.28则不允许.

这种变化的后果是必须重新编译旧库并破坏传统汇编代码.

现在我想问一下:这个改变是什么时候做的?它在某处记录了吗?是否有一个链接器选项,使其接受32位绝对地址?

linux gcc x86-64 linker-errors relocation

21
推荐指数
1
解决办法
5787
查看次数

为什么不能直接设置指令指针?

关于x86程序集的维基百科文章称"程序员无法直接访问IP寄存器".

直接表示像mov和add这样的指令.

为什么不?这背后的原因是什么?有哪些技术限制?

x86 cpu-registers program-counter

19
推荐指数
2
解决办法
1万
查看次数

代替x86汇编'call'指令?

x86调用指令有哪些替代方案?也许类似于推送返回地址然后跳转?

他们也是获取内存当前位置的命令吗?

x86 assembly call

17
推荐指数
2
解决办法
2万
查看次数

打印C程序中的当前地址

想象一下,我有以下简单的C程序:

int main() {

int a=5, b= 6, c;
c = a +b; 
return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想知道表达式c = a + b的地址,即执行此添加的程序地址.我有可能使用printf吗?沿线的东西:

int main() {

int a=5, b= 6, c;
printf("Address of printf instruction in memory: %x", current_address_pointer_or_something)
c = a +b; 
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道如何通过使用gdb然后使用info line file.c:line找到地址.但是,我应该知道我是否也可以直接使用printf.

c memory

11
推荐指数
2
解决办法
4万
查看次数

获取x86的当前指令的地址

我使用Linux与x86(准确地说是64位).有没有办法可以得到当前指令的地址.其实我想写自己的简化版本的setjmp/longjmp.在这里,R ..发布了longjmp的简化版本.知道如何实现setjmp.一个简化的版本,没有考虑异常和信号等...

c linux 64-bit x86 assembly

11
推荐指数
3
解决办法
2万
查看次数

重定位 R_X86_64_32 针对 `.data' 不能在创建共享对象时使用;

我写了下面的汇编代码,它可以直接通过as和ld构建pass。

as cpuid.s -o cpuid.o
ld cpuid.o -o cpuid
Run Code Online (Sandbox Code Playgroud)

但是当我使用gcc来完成整个过程时。我遇到以下错误。

$ gcc cpuid.s -o cpuid
/tmp/cctNMsIU.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o:(.text+0x0): first defined here
/usr/bin/ld: /tmp/cctNMsIU.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/usr/bin/ld: final link failed: Invalid operation
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

然后我将 _start 修改为 main,并将 -fPIC 添加到 gcc 参数。但这并不能解决我的 ld 错误。错误消息更改为以下。

$ gcc …
Run Code Online (Sandbox Code Playgroud)

c assembly ld

8
推荐指数
1
解决办法
7348
查看次数

如何在C中打印程序计数器的精确值

我想写一个C程序,它会打印程序计数器的内容PC.可以从用户空间或程序集中完成,还是使用某些特定的内核例程?

c linux assembly arm linux-kernel

7
推荐指数
2
解决办法
1万
查看次数

为什么我不能保存rip的价值?

#include <stdint.h>
uint64_t rip;
int main()
{
    asm(
        "movq %%rip, %0\n" : "=m" (rip)
        );

    sleep(10);
}
Run Code Online (Sandbox Code Playgroud)

当我编译我得到

cc -m64    rip.c   -o rip
/tmp/ccwNbZi1.s: Assembler messages:
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq'
make: *** [rip] Error 1
Run Code Online (Sandbox Code Playgroud)

x86 assembly

6
推荐指数
1
解决办法
4185
查看次数