📄 来来来,我们一起玩汇编.txt
字号:
来来来,我们一起玩汇编
--------------------------------------------------------------------------------
第八军团 时间:2003-11-29 9:13:58
在C语言中,一个完整的程序必须有一个main()函数作为程序的入口点,可能拥有一个或多个子函数;可能拥有一个或多个包含文件。虽然不是每个程序都是相同,但所有程序的基本结构都是这样的。
在汇编语言中也有类似的基本结构。
一个汇编程序有至少一个代码段,可能有一个或多个数据段、堆栈段,开始及结束代码,等等。下面我们就来看一下汇编语言的"Hello World!"程序并以此来描述一下汇编语言的基本结构。
01 Data Segment
02 Msg DB " Hello,World!",13,10,"$"
03 Data Ends
04 Stack Segment STACK
05 DW 128 Dup(0)
06 Stacktop:
07 Stack Ends
08 Code Segment
09 Assume CS:Code,DS:Data,ES:Data,SS:Stack
10 Start:
11 Mov AX,Stack
12 Lea SP,Stacktop
13 Mov SS,AX
14
15 Mov AX,Data
16 Mov DS,AX
17 Mov AH,9
18 Lea DX,offset Msg
19 Int 21H
20
21 Mov AX,4c00H
22 Int 21H
23 Code Ends
24 End Start
第一行到第三行定义数据段,在数据段中定义了一个名为Msg的字符串变量。
第四行到第七行定义堆栈段,堆栈可以保存128个字数据。Segment之后的STACK说明表示该段是堆栈段。最后的StackTop标号表示栈顶的偏移地址
第八行到第二十三行定义代码段。
第九行定义各段中的变量、标号所对应的缺省段寄存器。Code段中的标号对应于CS,比如我要在程序中访问Start中的数据,如:Mov EAX,DWORD Ptr Start,编译器就会自动把它编译成:Mov EAX,DWORD Ptr CS:Start。
第十行定义一个标号,标号一般作为某段程序(子程序、条件处理等等)的入口点,在这个程序中它作为整个程序的入口。
第十一行到第十六行是初始化代码,首先初始化堆栈段,使SS:SP指向栈顶,然后初始化数据段,使用DS指向程序的数据段。
第十七行到第十九行才是程序真正做事的部分,调用DOS功能调用在屏幕显示“Hello,World!”。
第二十行到第二十一行是结束代码,调用DOS功能返回命令行,如果不调用结束代码通常的结果是死机,以前我就经常犯这样的错误,大家要引以为戒啊:)。
这最后一行呢,是告诉编译器程序已经结束(编译器将不理睬END之后的内容),并且指出程序应该从什么地方开始运行。大家可以把这行中的START去掉然后单步调试一下看看会有什么后果。
以上就是最常见的汇编程序的格式,希望能让初学者们摆脱一些无谓的死机的困扰。
明白了吗?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -