汇编语言学习——第四章 第一个汇编程序

1、一个汇编语言程序从写出到最终执行的简要过程:

编写--> 编译,链接 --> 执行

 

2、编译,链接

使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件;

再用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。

 

3、可执行文件

可执行文件中包含两部分内容:
程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
相关的描述信息(比如:程序有多大、要占多少内存空间等)

 

4、一个简单的源程序

assume cs:codesg

codesg segment

start:

       MOV AX, 0123H

       MOV BX, 0456H

      ADD AX, BX,

      ADD AX, AX

// 程序返回

MOV  AX, 4C00H

INT 21H

codesg ends

end start

 

5、指令

1)汇编指令有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。

2)伪指令。没有对应的机器码的指令,最终不被CPU所执行。

伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。

 

6、定义一个段

 segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。

 segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。

一个段必须有一个名称来标识,使用格式为:

段名 segment

段名 ends

 

7、End。

END是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。

如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。

 

8、程序返回
应该在程序的末尾添加返回的程序段。
    mov ax,4c00H
    int 21H
这两条指令所实现的功能就是程序返回。

 

9、编译和链接的作用

连接的作用有以下几个:
1)当源程序很大时,可以将它分为多个源程序文件来编译,

每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;

2)程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
3)一个源程序编译后,得到了存有机器码的目标文件,

目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。

 

所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。

注意,对于连接的过程,可执行文件是我们要得到的最终结果。

 

10、程序的执行

程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。

一个程序的执行必须由一个正在执行的程序对其进行调用。

在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2 ,

将 P1 从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;

当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。

 

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

编程->1.asm->编译(masm) ->1.obj ->链接(link) ->加载->内存中的程序->CPU运行

 

11、程序执行过程的跟踪   debug 1.exe

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

这个内存区的前256 个字节中存放的是PSP,dos用来和程序进行通信。

从 256字节处向后的空间存放的是程序。

 
所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA×16+0。

因为PSP占256(100H)字节,所以程序的物理地址是:
   SA×16+0+256= SA×16+16×16=(SA+16)×16+0
可用段地址和偏移地址表示为:SA+10:0。

 

到了 int 21,我们要用P命令执行:

int 21 执行后,显示“Program terminated normally”,返回到Debug中。

表示程序正常结束。

注意,要使用P命令执行int 21。

 

个人总结: 这一章通过编写第一个源程序,认识源程序从编写到被执行的过程。

 

转载于:https://www.cnblogs.com/bbsno1/p/3263049.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用内存文件系统

在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk。 RamDisk有三种实现方式: 第一种就是传统意义上的,可以格式化,然后加载。 这在Linux内核2.0/2.2就已经支持,其不足之处是大小固定&#xff0…

射频通路 隔直_2.4G射频双向功放电路的设计与制作

2.4G射频双向功放电路的设计与制作在两个或多个网络互连时,无线局域网的低功率与高频率限制了其覆盖范围,为了扩大覆盖范围,可以引入蜂窝或者微蜂窝的网络结构或者通过增大发射功率扩大覆盖半径等措施来实现。前者实现成本较高,而…

Navicat怎么看oracle作业,[数据库] Navicat for Oracle基本用法图文介绍

打开具体的T_USER_INFO.sql文件代码以下所示:/*Navicat Oracle Data TransferOracle Client Version : 11.2.0Source Server : 远程oracle链接Source Server Version : 110200Source Host : XXXSource Schema : XXXXXXTarget Server Type : ORACLETarget Server Ver…

慕课乐学python单元测试答案_中国大学慕课第三章单元测试答案_乐学软件工程免费答案...

佩戴铂金的好处有哪些人教版八年级下册思想品德全品学练考第七课第1课时财产属于谁答案白金项链变黑了怎么办,如何清洗白金的种类有哪些天津少儿医保如何结算报销?铂金和白金哪个贵,需注意什么黄金项链的保养方法有哪些佩戴铂金的好处有哪些人…

linux arp 文件,LINUX 下ARP 的查找

由于内网无法正常连接网关,远程登陆网关已无法实现。因此一切操作均在网关服务器本地进行。3.1 在服务器本地端口抓包[rootRouted-Server tmp]# tcpdump -nn -i eth1 > error.networktcpdump: listening on eth12749 packets received by filter0 packets…

Android的Recovery中font_10x10.h字库文件制作

任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上现成的,但font_10x18.h来历短暂的留存在脑子里边不如记下来,这样会…

git 新建分支并切换到该分支_Git何谓分支

在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一…

linux用户恢复正常,Linux系统用户口令安全恢复方法

Linux系统用户口令安全恢复方法2007-09-07eNet&Ciweek有许多原因可能导致用户口令的遗失,这对系统管理员而言,可能不是一个问题,只要以root账号登录,再用passwd命令更改用户口令就可以了。可是,如果丢失的是root口…

A20 init.sun7i.rc 文件

如果需要在开机的时候,自动加载一些ko文件,或者通过chmod修改一些设备文件的属性,都可以再 init.sun7i.rc文件中添加insmod和chmod命令来实现。 init.sun7i.rc文件在 android4.2/out/target/product/wing-mbox230/root目录下。 但是实际操…

python 多元线性回归的系数检验 t p值_多元线性回归检验t检验(P值),F检验,R方等参数的含义...

做线性回归的时候,检验回归方程和各变量对因变量的解释参数很容易搞混乱,下面对这些参数进行一下说明:1.t检验:t检验是对单个变量系数的显著性检验 一般看p值; 如果p值小于0.05表示该自变量对因变量解释性很强。2…

linux c 内存elf,gcc加入linux ELF有什么功能?

这些大多数是在“主”程序本身之前或之后执行代码的各种方法,大多数都在crtstuff.c(https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c)中.它们存在以支持各种C类编程语言的特征,但它们也可以在C中访问.这可能似乎过于复杂,因为其中一些代表了传统的行李,还有一…

hdu 4322 最大费用流

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4322 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace s…

es6遍历树结构并判断_ES6和ES5中数据结构的遍历

看了ES6就感觉各种数据结构的遍历方法好多好混乱&#xff0c;就写下来总结下&#xff0c;看看应用场景上有什么区别Array:ES5:(1)Array.prototype.forEach(function(item,index,array){...})(2)Array.prototype.map(function(value,index,array){...//return value,该值会被插入…

EAT/IAT Hook

标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #include <windows.h> #include <shlwapi.h> #include <wchar.h> DWORD MyZwGetContextThread(HANDLE Thread,LPCONTEXT lpContext) {memset(l…

wireshark过滤规则

1.过 滤 IP&#xff0c;如来源IP或者目标IP等于某个IP例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107或者ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP2.过滤 端 口例子:tcp.port eq 80 // 不管端口是来源的还是目标的都显示tcp.port 80tcp.port eq 2722tc…

springboot 别名不起作用_springboot之mybatis别名的设置

mybatis别名设置在具体的mapper.xml文件中&#xff0c;定义很多的statement&#xff0c;statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。一.mybatis默认支持别名别名映射的类型_bytebyte_longlong_shortshort_intint_integerint_double…

Linux 编译 libc log,在Android的源码中添加LOG

想在Opencore代码中添加打印信息&#xff0c;但是使用OpenCore自带的PVLOGGER&#xff0c;有一定的局限&#xff0c;因为只能在创建对象调用相应的ThreadLogon()后才能使用。所以不能实现在任何函数中添加。于是通过添加Log.h的方法来添加。首先转下别人的经验我试了下还是出先…

《哈佛幸福课》笔记

前言&#xff1a;幸福感是衡量人生的唯一标准&#xff0c;是所有目标的最终目标 积极心理学 第一课 什么是积极心理学 与缺乏实质内容的心理自助行动不同&#xff0c;积极心理学从学术界而来&#xff0c;有着严谨的学术内容&#xff0c;并且兼顾应用到生活的方方面面&#xff…

ubuntu修改用户名、计算机名、主目录名

今天是MPI并行程序设计这门课交作业的截止日期&#xff0c;我们寝室的张佳和刘庆的本科同学来了&#xff0c;所以他们也没有时间搞&#xff0c;我就又做一回好人吧&#xff01;帮他们搞一下&#xff01;帮他们写报告的过程中最主要的问题就是跑那个MPI的程序&#xff0c;因为我…

linux redis可视化工具,几款开源的图形化Redis客户端管理软件

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 它自带一个最小化的命令行式的数据库管理工具&#xff0c;有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理工具…