如果进程的退出状态为0,则认为该进程已在Linux中正确完成.
我已经看到分段错误经常导致退出状态为11,但我不知道这是否只是我工作的惯例(那些失败的应用程序都是内部的)或标准.
Linux中的进程是否有标准退出代码?
操作系统:ubuntu2204
编译器:gcc 11.2 x86_64
这是一个简单的代码:
#include <cstdlib>
int func(int val) {
if (val == 1) {
} else {
abort();
}
}
int main(int argc, char* argv[]) {
func(argc);
}
Run Code Online (Sandbox Code Playgroud)
当我在没有任何优化的情况下编译它并运行它时,它工作正常。
但是当我用 编译它时g++ tmp.cpp -O3,结果func会忽略输入值,而只调用abort.
当然,我可以通过在 的末尾添加 return 语句来修复它func,但是,为什么呢?
这是objdump -d a.out优化函数的一些输出func:
0000000000001060 <_Z4funci>:
1060: f3 0f 1e fa endbr64
1064: 50 push %rax
1065: 58 pop %rax
1066: 50 push %rax
1067: e8 e4 ff ff ff …Run Code Online (Sandbox Code Playgroud) c++ optimization assembly compiler-optimization undefined-behavior
我正在使用 MASM 和 Irvine32 编写基本的 ASM 代码。该代码按字符输入,用户输入他们想要输入的字符数,然后循环运行那么多次。
该程序仅接受字母。如果按下 num 或其他内容,则显示“拒绝”消息。
如果 ECX == 0(用户输入的数字),则返回 Main(调用函数)。
现在我的问题是ret指令将控制权交还给同一过程(称为过程)的开始,而不是返回到主程序(调用者)。
include Irvine32.inc
.data
Input_Prompt BYTE "Enter String:", 0
Max_Length_input BYTE "Enter max length to read:", 0
Rejected_mess BYTE "Rejected !", 0
ret_mess BYTE "returing mess !", 0
USER_STR BYTE ?
.code
main PROC
mov edx, offset Max_Length_input ;ask for max length
call WriteString
call Readint
mov ecx, eax
mov esi, offset USER_STR ;passing offset of storage
call String_Input
main endp
String_Input PROC …Run Code Online (Sandbox Code Playgroud) 我正在学习 x86 汇编。我试图了解“退出程序”如何在 x86 上工作。我们有一个代码:
push ebp
mov ebp,esp
//Some stuff here
mov esp, ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)
当处理器执行指令“ret”时:
EIP 将具有从堆栈中弹出的值,即 0。因此处理器将转到 0 地址并尝试执行不包含程序代码/可执行代码的指令。那么,处理器到底发生了什么?是否有条件检查,例如,if EIP = 0 -> exit program? Or if ESP out of bounds -> exit program?`处理器如何理解这条 RET 指令是程序的结尾?