【发布时间】:2021-02-26 10:29:50
【问题描述】:
我正在尝试使用汇编程序编码实现一个 for 循环,并且在每次迭代中应该打印寄存器 edi 的值。当我尝试执行我的代码时,我收到错误“分段错误(核心转储)”。谁能告诉我这个错误是什么意思,我的代码有什么错误吗?
section .text
global _start
_start:
xor edi,edi
loop:
add edi,'0'
;print i
mov edi,1
mov esi,1
mov ecx,[edi]
mov edx,1
syscall
sub edi,'0'
inc edi
cmp edi,5
jl loop
【问题讨论】:
-
mov edi,1会覆盖您之前拥有的'0'值,但它们都不是有效地址,因此尝试使用[edi]内存源操作数是没有意义的。此外,Linux 的 writesyscall采用 RSI 中的指针,并忽略 RCX(实际上,系统调用指令本身在内核获得控制之前写入 RCX。)我想知道您是否从使用 @987654326 的 32 位代码中复制了 ECX 部分@。 (它仍然是错误的......)
标签: linux assembly x86 segmentation-fault