王爽 《汇编语言》 读书笔记 四 第一个程序

第四章 第一个程序


4.1 一个源程序从写出到执行到过程

1) 编写汇编源程序

2)对源程序进行编译连接

    可执行文件包含两部分内容。   

       程序(从源程序中对编译指令翻译过来对机器码)和数据(源程序中定义对数据)

       相关对描述信息(比如,程序有多大,要占用多少内存空间等)

3)执行可执行文件中对程序。 (将机器码和数据载入内存,并进行相关初始化CS:IP)然后由cpu执行程序。


4.2 源程序

第一个程序

assume cs:codeseg

codesg segment

	mov ax, 0123H
	mov bx, 0456H
	add ax, bx
	add ax, ax
	
	mov ax, 4c00H
	int 21H

codesg ends

end
汇编语言中包含两种指令 为指令 和 汇编指令

0. 汇编指令 :有对应机器码对指令,可以被编译为机器码

1.伪指令:编译器来执行对指令,编译器根据为指令进行相关编译工作。

1)segment

定义一个段对开始和结束 xxx 为段名

XXX segment

XXX ends

2)end 一个汇编程序对结束标记,编译器在遇到此伪指令将结束编译。注意区分end和ends


3)assume 假设某一段寄存器和程序中对某一个segment ends定义对段相关联。 例如 assume cs:codesg   将cs 和codeseg对地址关联起来


2. 源程序中的“程序”

程序指最终由计算机执行,处理的指令或数据

源程序就是包含汇编指令和伪指令代码的文件。


3. 标号

例如codesg  一个标号指代一个地址。

4. 程序的结构

源程序由一些段构成。段中存放代码,数据,或将某个段当作栈空间。

assume cs:abc

abc	segment
	mov ax, 2
	add ax, ax
	add ax, ax
abc	ends

end


5. 程序返回

mov ax, 4c00H
int 21H

让程序返回


段结束: ends

程序结束: end

程序返回   mov ax, 4c00H

                 int 21H

6 语法错误和逻辑错误

assume cs:abc

abc	segment
	mov ax, 2
	add ax, ax
	add ax, ax
	
	mov ax, 4c00H	; return the program to system
	int 21H
abc	ends

end


4.3 编辑源程序


这里使用Notepad++  也可以使用dos下段Edit, VIM等


4.4 编译

OBJ 源程序编译成目标文件

NULL.LST 列表文件 (可忽略)

NULL.CRF 交叉引用文件 (可忽略)


4.5 连接

使用微软等Overlay Linker 3.60

NULL。MAP  中间文件 可忽略

LIB  库文件  将库和目标文件连接在一起。  由于没有调用任何子程序,这里可以忽略。

这里提示没有栈段段警告。暂时忽略。

连接段简单作用:

1)当程序很大当时候,可以将他分为多个源文件来编译,每个源文件编译为目标文件后,再用连接器将它们连接到一起,生成一个可执行文件;

2)程序中调用某个库文件到子程序,要将这个库文件和该程序生成到目标文件连接到一起,生成一个可执行文件。

3)目标文件中到内容还不足以作为可执行文件,连接器处理这些最终到信息。所以只有一个源程序到情况下对目标文件也需要进行连接。


4.6 简化对方式进行编译和连接

使用命令行参数

masm c:\cp4\1.asm;
link 1;



4.7 1.exe执行

由于并没有输出命令行信息,因此执行以后看不到任何效果。


4.8 谁可将可执行对程序壮哉入内存并使用它们

command.exe装载1.exe


操作系统的外壳

DOS中有一个command。com dos命令解释器dos启动以后由command.com来解释用户的输入 

如果用户启动一个程序,输入该程序的名称,command首先找到该可执行文件,然后将该可执行文件装载入内存,设置CS:IP指向程序入口。

此后command暂停运行,CPU运行程序结束以后,返回command中。


汇编程序从写出到执行的过程

编程(edit) -》 1.asm -》编译(masm)-》1.obj -》 连接(link) -》1.exe -》加载(command)-》内存中的程序 -》运行


4.9 程序执行过程的跟踪


debug 1.exe


cx中存放的是程序的长度  cx =000cH

空闲内存区 : SA:0

PSP区     SA:0   ;和dos操作系统通信


程序区      SA+10H:0

将内存起的段地址存入DS,初始化其他相关寄存器后,设置CS:IP指向程序入口

还有一个称为重定位段操作和操作系统相关,这里不讲解。


1)加载程序后ds中存放程序所在内存区段段地址,这个内存起段偏移地址为0,则程序所在内存起段地址为ds:0

2)这个内存区前256字节存放段是PSP,DOS用来和程序通信。葱56字节后面存放段空间是程序


程序加载顺序是 : command 加载Debug, Debug加载1.exe

返回顺序是 1.exe返回Debug  ,Debug返回到command


查看PSP区段内容


实验代码

assume cs:codesg

codesg segment
	mov ax, 2000H
	mov ss, ax
	mov sp, 0
	add sp, 10
	pop ax
	pop bx
	push ax
	push bx
	pop ax
	pop bx
	
	mov ax, 4c00H
	int 21H
codesg ends

end


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值