Linux 汇编代码持续显示段故障
为什么这个汇编代码可以很好地组装和链接,但在运行时显示段错误。在指示后发表评论,给出我想要做的想法Linux 汇编代码持续显示段故障,linux,assembly,x86,system-calls,Linux,Assembly,X86,System Calls,为什么这个汇编代码可以很好地组装和链接,但在运行时显示段错误。在指示后发表评论,给出我想要做的想法 jmp short init action: pop esi xor eax, eax mov byte [esi+24], al ;null terminating the string. mov dword [esi+25],24 ;length of the string mov al,4 ;syscall write mov ebx,1 ;standard
jmp short init
action:
pop esi
xor eax, eax
mov byte [esi+24], al ;null terminating the string.
mov dword [esi+25],24 ;length of the string
mov al,4 ;syscall write
mov ebx,1 ;standard out
lea ecx,[esi] ;<<---------- Unsure about this. probably load the address of the string to ecx
mov edx,[esi+25] ;<<-- load edx with string length
int 80h
init:
call action
db "what a pity! not working#LLLL"
jmp短初始化
行动:
波普esi
异或eax,eax
mov字节[esi+24],al;null终止字符串。
莫夫·德沃德[esi+25],24;字符串长度
mov al,4;系统调用写入
mov-ebx,1;标准输出
lea-ecx[esi] 您希望字符串的地址位于ecx
中。那么,您为什么要使用esi
?使用pop ecx
时,您已经将其保存在正确的寄存器中。无论如何,你不需要它来做其他的事情
除此之外,您正在写入默认不可写入的代码段。您的字符串似乎位于部分。text
(如果您不说,Nasm将默认为)是只读内存。试图改变它将导致故障。如果它运行,它将永远循环。我没有看到一个sys\u exit
,原来的程序有一个sys\u exit。如何使其可写?在我看来是递归的-转到:init并再次调用action…感谢您对弹出ecx的建议。但是pop-esi
有问题吗。另外,如何使代码可写部分。text write
将使.o文件可写。扔掉它。看,可写!但是,ld将其更改回只读:(section.kode exec write
似乎可以工作。我认为有一种方法可以让ld用.text
完成这项工作,但我不知道。最好不要!