Assembly Main和其他东西一样叫吗?

Assembly Main和其他东西一样叫吗?,assembly,main,Assembly,Main,如果你看一下标准的汇编,main是否像普通函数一样被调用,之后ret和sfp被放在堆栈上,等等?有一个巨大的objdump,我认为这是必然的,因为init和其他东西发生在main之前,对吗?程序中的实际入口点是以特定于操作系统的方式启动的。我相信在windows上你会得到一个回信地址,所以叫做。例如,在linux中,不能使用ret来结束程序 如果你说的是Cmain函数,那么你应该知道它不是程序的入口点,因为它驻留在C库的启动代码中,启动代码实际上会调用你的main如果你使用的是8086汇编程序,

如果你看一下标准的汇编,main是否像普通函数一样被调用,之后ret和sfp被放在堆栈上,等等?有一个巨大的objdump,我认为这是必然的,因为init和其他东西发生在main之前,对吗?

程序中的实际入口点是以特定于操作系统的方式启动的。我相信在windows上你会得到一个回信地址,所以叫做。例如,在linux中,不能使用
ret
来结束程序


如果你说的是C
main
函数,那么你应该知道它不是程序的入口点,因为它驻留在C库的启动代码中,启动代码实际上会调用你的
main
如果你使用的是8086汇编程序,“main”只是一个带有任何名称的标签,有些人称它为“start”或“begin”。编译器知道它是起点,因为在代码末尾添加了“end main”或“end begin”

在下面的示例中,“main”或“begin”是起点,因此数据段的初始化将永远不会执行,因为它位于“main”/“begin”标签之前

因为“main”/“begin”不是过程,所以它们不需要RET,因为它们从不在哪里用“call”指令调用(堆栈上没有返回地址)。这就是为什么必须以ax=4c00h int 21h结束程序:

.stack 100h
.data
.code   
;INITIALIZE DATA SEGMENT.
  mov  ax,@data
  mov  ds,ax

main:           ;<======================
  xor  ax, ax  

;FINISH THE PROGRAM.
  mov  ax,4c00h
  int  21h         

end main           ;<======================
.stack 100h
.数据
.代码
;初始化数据段。
mov-ax,@data
mov-ds,ax

主要: 行为取决于上下文,例如,如果您的代码在windows上运行,“main”是入口点,在进程启动后由操作系统调用,并且在程序结束时确实有一个要返回的地址,它还将EAX读取为退出代码

下面是windows调用入口点时的外观

/. 55             PUSH EBP
|. 8BEC           MOV EBP,ESP
|. 85C9           TEST ECX,ECX
|. 75 0C          JNZ SHORT KERNEL32.7672A53B
|. FF75 08        PUSH DWORD PTR SS:[EBP+8]
|. FFD2           CALL EDX <- Program entry point is called
|. 50             PUSH EAX
|. FF15 B4117976  CALL DWORD PTR DS:[<&ntdll.RtlExitUserTh>;  ntdll.RtlExitUserThread
|> F605 D002FE7F >TEST BYTE PTR DS:[7FFE02D0],10
|. 74 09          JE SHORT KERNEL32.7672A54D
|. E8 0F000000    CALL KERNEL32.7672A558
|. 85C0           TEST EAX,EAX
|. 78 02          JS SHORT KERNEL32.7672A54F
|> 33C0           XOR EAX,EAX
|> 5D             POP EBP
\. C2 0400        RETN 4
/。55推EBP
|.8BEC MOV EBP,ESP
|.85C9测试ECX,ECX
|.75 0C JNZ短内核32.7672A53B
|.FF75 08推送DWORD PTR SS:[EBP+8]
|.FFD2调用EDX F605 D002FE7F>测试字节PTR DS:[7FFE02D0],10
|.74 09 JE短内核32.7672A54D
|.E8 0F000000调用内核32.7672A558
|.85C0测试EAX,EAX
|.78 02 JS短内核32.7672A54F
|>33C0异或EAX,EAX
|>5D波普EBP
\.C2 0400 RETN 4

标准部件没有标准的
main
是吗?还有,你问的是哪个大会?x86?这取决于实现,但是是的,通常在台式机中,
main
是从init代码调用的,实际上是
ret=main(argc,argv),完成所有初始化工作后。当
main
返回时,init代码调用任何
atexit()
回调以及其他职责,然后调用
exit(ret)
。在嵌入式平台或模拟器中,情况可能并非如此——模拟器可以简单地在
main()
处开始执行,已经设置好了所有内容。“标准组件?”没有这样的东西。汇编语言总是特定于处理器指令集体系结构(ISA)。
/. 55             PUSH EBP
|. 8BEC           MOV EBP,ESP
|. 85C9           TEST ECX,ECX
|. 75 0C          JNZ SHORT KERNEL32.7672A53B
|. FF75 08        PUSH DWORD PTR SS:[EBP+8]
|. FFD2           CALL EDX <- Program entry point is called
|. 50             PUSH EAX
|. FF15 B4117976  CALL DWORD PTR DS:[<&ntdll.RtlExitUserTh>;  ntdll.RtlExitUserThread
|> F605 D002FE7F >TEST BYTE PTR DS:[7FFE02D0],10
|. 74 09          JE SHORT KERNEL32.7672A54D
|. E8 0F000000    CALL KERNEL32.7672A558
|. 85C0           TEST EAX,EAX
|. 78 02          JS SHORT KERNEL32.7672A54F
|> 33C0           XOR EAX,EAX
|> 5D             POP EBP
\. C2 0400        RETN 4