汇编编程

一个源程序从写入到执行的过程

共分为三部:

  1. 编写源程序
  2. 编译连接,编译后生成的可执行文件分为两部分:
    • 程序和数据
    • 相关的描述信息(提供给操作系统的)
  3. 执行
    在操作系统中,执行可执行文件时。操作系统将按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载进入内存,并进行相应的初始化。

源程序

assume cs:codesg
codesg segment
    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,ax
codesg ends
end

该段源程序分为三部分

  1. 伪指令
  2. 程序(汇编指令)
  3. 标号

伪指令没有对应的机器码(不是汇编指令)。被编译器来执行。
比如segmentends就是一对成对使用的伪指令,这是编写被编译器编译的汇编程序必须要使用的一对伪指令。segment和ends的功能就是声明一个段。segment说明一个段的开始,而ends则说明一个段的结束。一个段必须有一个名称来标识(标号)
一个汇编程序就是有多个段来组成的,分别用来存放数据和代码。一个源程序将计算机所要处理的信息按类别划分待不同的段中。
end指令指示整个程序的结束。编译器如果碰到了伪指令end,就会结束对源程序的编译。
assume假设某一段寄存器与程序中的某一个段相关联。在需要时编译程序可以将段寄存器和某一个具体的段相关联。
汇编源程序中的标号代表了一个地址,比如codesg作为一个段的名称。在他最终被编译以后,连接程序将其处理为一个段的段地址。
UTOOLS1560169840527.png
好像可以这样认为,一个汇编程序就是有程序段和数据段组成。

程序的返回

以DOS(单任务操作系统)为基础讨论。
程序P1将可执行文件P2装入内存,并将cpu控制权交给P2。P2开始运行,P1暂停。
P2运行结束,将cpu控制权交还给使他运行的程序P1,之后P1继续运行。
其中,这个交还cpu控制权的过程,称为程序返回。
其中,

mov ax,4c00H
int 21H

实现程序返回的功能。
UTOOLS1560169885399.png

语法错误和逻辑错误

语法错误就是一般可以在编译期间发现的错误
而逻辑错误通常要在程序运行中才能够发现。
其中,逻辑错误要比语法错误能以解决。

谁将可执行文件中的程序装在如内存并使他运行

对于DOS环境,也就是是command.exe(系统shell)。
任何通用操作系统都会提供一个shell(壳)程序,这是用户和系统进行交互的接口(方式之一)。

debug为什么能实现程序执行的跟踪

这是因为和shell执行可执行文件不同,debug并不会完全放弃对cpu的控制。
UTOOLS1560169960996.png
debug将可执行文件装入内存以后,cx中存放程序的长度(汇编指令的长度)
UTOOLS1560169982794.png
PSP占256个字节,观察图4.19可以发现ds和cs相差10H。这也可以从侧面证明这一点。
PSP是DOS用来和程序进行通信的,之后才存放的是真正的程序。





原文地址:https://www.cnblogs.com/freesfu/p/11000012.html