汇编中的入口点到底是哪啊?

Leasangle 2010-07-21 01:27:45
我知道入口点是start,但是...
下面两段代码,除了内容不一样,编写的格式都是先写过程,后写start,可很纳闷第一个可以从start开始,而第二个去硬是要从过程开始。
连接的命令是:link /debug /subsystem:console /entry:start /out:ex8_1_2.exe ex8_1_2.obj io.obj kernel32.lib
第一个是汉诺塔问题,递归调用的练习,debug时是从start进入的

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall,dwExitCode:DWORD

include io.h

cr equ 0dh
Lf equ 0ah

.STACK 4096

.DATA
prompt BYTE cr,Lf,'How many disks? ',0
number BYTE 16 DUP(?)
message BYTE cr,Lf,'Move disk from spindle '
source BYTE ?,' to spindle '
dest BYTE ?,'.',0

.CODE

Move PROC NEAR32
push ebp
mov ebp,esp
push eax
push ebx

cmp WORD PTR [ebp+14],1
jne elseMore
mov bx,[ebp+12]
mov source,bl
mov bx,[ebp+10]
mov dest,bl
output message
jmp endIfOne
elseMore:
mov ax,[ebp+14]
dec ax
push ax
pushw [ebp+12]
pushw [ebp+8]
pushw [ebp+10]
call Move
add esp,8

pushw 1
pushw [ebp+12]
pushw [ebp+10]
pushw [ebp+8]
call Move
add esp,8

push ax
pushw [ebp+8]
pushw [ebp+10]
pushw [ebp+12]
call Move
add esp,8
endIfOne:
pop ebx
pop eax
pop ebp
ret
Move ENDP

_start:
output prompt
input number,16
atoi number

push ax
mov al,'A'
push ax
mov al,'B'
push ax
mov al,'C'
push ax
call Move
add esp,8

INVOKE ExitProcess,0

PUBLIC _start

END


第二个本来是整数与字符串的转换,但我把核心部分拿掉了,过程体里什么也不做,就只是压栈和出栈,
可它偏偏要从过程开始。。

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall,dwExitCode:DWORD

include io.h

cr EQU 0dh
Lf EQU 0ah

.STACK 4096

.DATA
prompt BYTE "Enter a 16's number:",0
number BYTE 20 DUP(?)
result BYTE "The octal representation is:"
octOut BYTE 6 DUP(?),cr,Lf,0

.CODE

ToOctal PROC NEAR32
push ebp
mov ebp,esp
pushad
pushf
quit:
popf
popad
pop ebp
ret 8
ToOctal ENDP

_start:
output prompt
input number,20
atod number

push eax
lea eax,octOut
push eax
call ToOctal

output result

INVOKE ExitProcess,0

PUBLIC _start

END
...全文
1556 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leasangle 的回复:]
但是为什么我第一段代码,END后面没有指定,却能从start开始?
PS:我看的书是《80x86汇编语言与计算机体系结构》,06年版本的,里面最后的END一直没带什么。。[/Quote]
如果没有通过 END 语句指定程序从哪里开始,或者如在顶楼里提到的在链接时通过 /ENTRY:start 选项来指定的话,链接时 Masm32 会报错吧。否则,如果指定了入口,应该不会出现从过程开始而不是所指定的 start:
jvphxys 2010-07-21
  • 打赏
  • 举报
回复
start只是一个标号,跟你自定义的标号没什么不同。汇编是顺序执行的程序,实际上你的程序从.CODE处就开始执行代码。你所定义的过程如果在.CODE之后,按理应该被预执行一次,一般写程序都把过程放在后面。如果是C当然是从MAIN()函数开始,过程或宏放在前面也可以,但是汇编不一样。所以,真正程序的开始是你自己想要定义的主程序处开始,按照道理应该是越接近.CODE就越先执行。自己定义的过程或者宏如果不去调用虽然不影响结果,但是却影响执行效率。
很久没碰汇编了,可能有一定的错误,还请高手指正。按照我的说法,现在的问题反而是为什么第一个程序会在DEBUG的时候首先执行START后面的语句。。我觉得应该是因为IO.H的调用,IO一般都处于其他调用之前,属于底层调用。
还望高手解答,呵呵,俺已经差不多两年没碰汇编了,不知道对不对。
nerishur 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leasangle 的回复:]
引用 1 楼 zara 的回复:
程序从哪里开始执行,是由 END start 这样的语句指定的。END 后跟的是 start ,就从 start: 标号处开始执行;跟的是其它的,就从其它那里开始执行。不是程序有了 start: 或类似的标号,就会从 start: 处开始执行的;必须通过 END start 这样的语句来指定!

但是为什么我第一段代码,END后面没有指定,却能从start开……
[/Quote]

或许是定义了一个宏吧
Leasangle 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zara 的回复:]
程序从哪里开始执行,是由 END start 这样的语句指定的。END 后跟的是 start ,就从 start: 标号处开始执行;跟的是其它的,就从其它那里开始执行。不是程序有了 start: 或类似的标号,就会从 start: 处开始执行的;必须通过 END start 这样的语句来指定!
[/Quote]
但是为什么我第一段代码,END后面没有指定,却能从start开始?
PS:我看的书是《80x86汇编语言与计算机体系结构》,06年版本的,里面最后的END一直没带什么。。
goodider 2010-07-21
  • 打赏
  • 举报
回复
就是这样吧
zara 2010-07-21
  • 打赏
  • 举报
回复
程序从哪里开始执行,是由 END start 这样的语句指定的。END 后跟的是 start ,就从 start: 标号处开始执行;跟的是其它的,就从其它那里开始执行。不是程序有了 start: 或类似的标号,就会从 start: 处开始执行的;必须通过 END start 这样的语句来指定!

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧