Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 汇编代码持续显示段故障_Linux_Assembly_X86_System Calls - Fatal编程技术网

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
完成这项工作,但我不知道。最好不要!