手机网站建设服务器,iis做网站之vps,网站备案文件吗,搭建网站需要的软件下载语雀原文链接 文章目录 1、执行过程第一步#xff1a;源程序第二步#xff1a;编译连接第三步#xff1a;执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字…语雀原文链接 文章目录 1、执行过程第一步源程序第二步编译连接第三步执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字的默认进制 4、DOS系统的shell 1、执行过程
第一步编写汇编源程序第二步对源程序进行编译连接。使用汇编语言编译程序对源程序文件中的源程序进行编译产生目标文件再用连接程序对目标文件进行连接生成可在操作系统中直接运行的可执行文件。可执行文件包含两部分内容。 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)相关的描述信息(比如,程序有多大、要占用多少内存空间等) 第三步执行可执行文件中的程序。 操作系统依照可执行文件中的描述信息将可执行文件中的机器码和数据加载入内存并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令)然后由CPU执行程序。 第一步源程序
在汇编语言源程序中包含两种指令一种是汇编指令一种是伪指令汇编指令是有对应的机器码的指令可以被编译为机器指令最终为CPU所执行伪指令没有对应的机器指令最终不被CPU所执行。伪指令是由编译器来执行的指令编译器根据伪指令来进行相关的编译工作。新建一个first.asm文件内容如下
assume cs:codemsg
codemsg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00Hint 21Hcodemsg ends
end上述代码有3中伪指令 第一条伪指令assume这个伪指令的含义为假设。假设某一段寄存器和程序中的某一个用segment…ends定义的段相关联。上述代码中用assume cs:codesg将把代码段的codesg和CPU中的段寄存器cs联系起来 第二条伪指令segment和ends是一对成对使用的伪指令这是在写可被编记择器编译的汇编程序时必须要用到的一对伪指令。segment和ends的功能是定义一个段segment说明一个段开始ends说明一个段结束。 第三条伪指令end是一个汇编程序的结束标记编译器在编译汇编程序的过程中如果碰到了伪指令end就结束对源程序的编译。所以在我们写程序的时候如果程序写完了要在结尾处加上伪指令end。否则,编译器在编译程序时,无法去知道程序在何处结束。注意不要搞混了end和endsends是和segment成对使用的,标记一个段的结束ends的含义可理解为end segment。我们这里讲的end的作用是标记整个程序的结束。 基本格式如下
assume 段寄存器:xxx
xxx segment汇编指令......
xxx ends
end第二步编译连接
编译连接 第三步执行
可执行文件怎么才能运行我们在DOS(一个单任务操作系统)的基础上一个程序P2在可执行文件中则必须有一个正在运行的程序P1将P2从可执行文件中加载入内存后将CPU的控制权交给P2P2才能得以运行。P2开始运行后P1暂停运行。而当P2运行完毕后应该将CPU的控制权交还给使它得以运行的程序P1此后P1继续运行。一个程序结束后将CPU的控制权交还给使它得以运行的程序我们称这个过程为程序返回。在程序的末尾添加返回的程序段就可以实现程序返回 mov ax,4c00Hint 21H2、DOSBox运行程序
第1步 进入EDIT.EXE
运行editIT/MASM文件中有几个EXE DEBUG.EXEdebug执行程序EDIT.EXE编辑执行程序LINK.EXE连接执行程序MASM.EXE编译执行程序 Z:\mount c d:\IT\MASM
Z:\c:
Z:\edit第2步 编写源程序
编写保存源程序 保存到c:\first.asm 第3步 编译
在编译一个源程序之前首先要找到一个相应的编译器。这里采用微软的masm5.0汇编编译器文件名为MASM.EXE。这里我们把它放在c:\MASM.EXE
C:\masm
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Source filename [.ASM]: 运行masm后首先显示出一些版本信息然后提示输入将要被编译的源程序文件的名称。[.ASM]提示我们默认的文件扩展名是asm如果要编译的源程序文件名是pl.asm只要在这里输入pl即可。可如果源程序文件不是以asm为扩展名的话就要输入它的全名。比如源程序文件名为pl.txt就要输入全名。在输入源程序文件名的时候一定要指明它所在的路径。如果文件就在当前路径下只输入文件名就可以可如果文件在其他的目录中则要输入路径。比如要编译的文件pl.txt在c:\windows/desktop下则要输入c:/windows/desktop\pbl.txt输入firstEnter回车3次即可 Object filename编译出的目标文件名称默认和源程序同名直接回车即可如果想自定义目标文件路径和名称例如输入“c:\xx\out”Source listing编译程序提示输入列表文件的名称这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果。可以让编译器不生成这个文件,直接按Enter键即可。Cross-reference编译程序提示输入交叉引用文件的名称这个文件同列表文件一样是编译器将源程序编译为目标文件过程中产生的中间结果。可以让编译器不生成这个文件,直接按Enter键即可。 在编译的过程中我们提供了一个输入即源程序文件。最多可以得到3个输出列表文件(.lst)、交叉引用文件(.crf)、目标文件(.obj)。这3个输出文件中目标文件是我们最终要得到的结果,而另外两个只是中间结果,可以让编译器忽略对它们的生成。在汇编课程中,我们不讨论这两类文件。
C:\masm
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Source filename [.ASM]: first
Object filename [first.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:51798 464746 Bytes symbol space free0 Warning Errors0 Server Errors
C:\masm第4步 连接
[.OBJ]输入要连接的文件此处输入first无须后缀.OBJRun File输入要生成的可执行文件的名称默认同名.EXE直接Enter使用默认值List File连接程序提示输入映像文件的名称这个文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果可以让连接程序不生成这个文件直接按Enter键即可。Libraries如果程序中调用了某一个库文件中的子程序就需要在连接的时候将这个库文件和目标文件连接到一起生成可执行文件。如果这个程序没有调用任何子程序这里忽略库文件名的输入直接按Enter键即可。最后输出一行警告no stack segment这里无需理会
C:\link
Microsoft (R) Overly Linker Version 3.60
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object Module [.OBJ]: first
Run File [FIRST.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment连接有什么作用 当源程序很大时可以将它分为多个源程序文件来编译每个源程序编译成为目标文件后再用连接程序将它们连接到一起生成一个可执行文件 程序中调用了某个库文件中的子程序需要将这个库文件利该程序生成的目标文件连接到一起生成一个可执行文件 3.一个源程序编译后得到了存有机器码的目标文件目标文件中的有些内容还不能直接用来生成可执行文件连接程序将这些内容处理为最终的可执行信息。所以在只有一个源程序文件而又不需要调用某个库中的子程序的情况下也必须用连接程序对目标文件进行处理,生成可执行文件。 上述的编译和连接写法步骤比较多可以简化以下忽略一些过程 masm c:\first;link first;
C:\masm c:\first;
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.51798 464746 Bytes symbol space free0 Warning Errors0 Server ErrorsC:\link first;
Microsoft (R) Overly Linker Version 3.60
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.LINK : warning L4021: no stack segment第5步 执行
直接运行FIRST.EXE输入first即可这里也看不到任何结果
C:\firstc:\完整过程 3、DEBUG跟踪执行过程
加载程序到内存
在DOS中运行一个程序的时候是由command将程序从可执行文件中加载入内存并使其得以执行。但是这样我们不能逐条扣指令地看到程序的执行过程因为command的程序加载设置CS:IP指向程序的入口的操作是连续完成的而当CS:IP一指向程序的入口command就放弃了CPU的控制权CPU了立即开始运行程序,直至程序结束。DEBUG将程序FIRST.EXE加载入内存进行相关的初始化后设置CS:IP指向程序的入口
c:\debug first.exe
-r
AXFFFF BX0000 CX000F DX0000 SP00FD BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP0000 NV UP EI PL NZ NA PO NC
076A:0000 B82301 MOV AX,0123
-u
076A:0000 B82301 MOV AX,0123
076A:0003 BB5604 MOV BX,0456
076A:0006 03C3 ADD AX,BX
076A:0008 03C0 ADD AX,AX
076A:000A B8004C MOV AX,4C00
076A:000D CD21 INT 21
076A:000F 0000 ADD [BXSI],AL
076A:0011 0000 ADD [BXSI],AL
076A:0013 0000 ADD [BXSI],AL
076A:0015 0000 ADD [BXSI],AL
076A:0017 0000 ADD [BXSI],AL
076A:0019 0000 ADD [BXSI],AL
076A:001B 0000 ADD [BXSI],AL
076A:001D 0000 ADD [BXSI],AL
076A:001F 0000 ADD [BXSI],AL可以看到程序加载到内存从076A:0000~076A:000E占据15个字节。CX000F存储的就是程序的长度程序为何存储在076A:0000开始可以看下图图中有一步重定位没有写这里不做介绍 程序加载后DS075A存放着程序所在内存区的段地址这个内存区的偏移地址为0所以这个内存区的地址为DS:0也就是075A:0000这个内存区的前256个字节存放的是PSPDOS用来和程序进行通信从256个字节向后的空间放的是程序所以程序真真是从075A10H 076A:0000开始的所以CS076A IP0000指向程序的第一条指令
执行程序
c:\debug first.exe
-r
AXFFFF BX0000 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP0000 NV UP EI PL NZ NA PO NC
076A:0000 B82301 MOV AX,0123
-u
076A:0000 B82301 MOV AX,0123
076A:0003 BB5604 MOV BX,0456
076A:0006 03C3 ADD AX,BX
076A:0008 03C0 ADD AX,AX
076A:000A B8004C MOV AX,4C00
076A:000D CD21 INT 21
076A:000F 0000 ADD [BXSI],AL
076A:0011 0000 ADD [BXSI],AL
076A:0013 0000 ADD [BXSI],AL
076A:0015 0000 ADD [BXSI],AL
076A:0017 0000 ADD [BXSI],AL
076A:0019 0000 ADD [BXSI],AL
076A:001B 0000 ADD [BXSI],AL
076A:001D 0000 ADD [BXSI],AL
076A:001F 0000 ADD [BXSI],AL// 执行MOV AX,0123结果AX0123 IP0003指向下一条指令
-t
AX0123 BX0000 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP0003 NV UP EI PL NZ NA PO NC
076A:0003 BB5604 MOV BX,0456// 执行MOV BX,0456结果BX0456 IP0006指向下一条指令
-t
AX0123 BX0456 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP0006 NV UP EI PL NZ NA PO NC
076A:0006 03C3 ADD AX,BX// 执行ADD AX,BX结果AX0579 IP0008指向下一条指令
-t
AX0579 BX0456 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP0008 NV UP EI PL NZ NA PO NC
076A:0008 03C0 ADD AX,AX// 执行ADD AX,AX结果AX0AF2 IP0006指向下一条指令
-t
AX0579 BX0456 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP000A NV UP EI PL NZ NA PO NC
076A:000A B8004C MOV AX,4C00// 执行MOV AX,4C00结果AX4C00 IP0006指向下一条指令
-t
AX4C00 BX0456 CX000F DX0000 SP0000 BP0000 SI0000 DI0000
DS075A ES075A SS0769 CS076A IP000D NV UP EI PL NZ NA PO NC
076A:000D CD21 INT 21// 最后执行int 21这里需要输入p
-p
Program terminated normallydebug和源程序数字的默认进制
在debug中默认所有数字都是 16 进制加了 h 反而会报错;在汇编源程序 .asm 中不加 h 则默认为 10 进制加 h 才表示 16 进制加 b 为后缀为二进制使用 debug 跟踪可执行程序 .exe 的时候debug会将不加 h 的 10 进制或者加了b为后缀的二进制变为对应的 16 进制。
4、DOS系统的shell
操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统都要提供一个称为shell(外壳)的程序用户(操作人员)使用这个程序来操作计算机系统进行工作。DOS中有一个程序command.com这个程序在DOS中称为命令解释器也就是DOS系统的shell。DOS启动时先完成其他重要的初始化工作然后运行command.com运行后执行完其他的相关任务后在屏幕上显示出由当前盘符和当前路径组成的提示符比如:c:或c:\windows等然后等待用户的输入。用户可以输入所要执行的命令比如cd、dir、type等这些些命令由command执行command执行完这些命令后再次显示由当前盘符和当前路径组成的提示符等持用户的输入。如果用户要执行一个程序则输入该程序的可执行文件的名称command首先根据文件名找到可执行文件然后将这个可执行文件中的程序加载入内存设置CS:IP指向程序的入口。此后command暂停运行CPU运行程序。程序运行结束后返回到command中command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。在DOS中command处理各种输入命令或要执行的程序的文件名。我们就是通过command来进行工作的。