ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • 电子嵌入式通信协议

  • 深入浅出SSD

  • 文件系统

  • 汇编语言

    • 第1章 基础知识
    • 第2章 寄存器
    • 第3章 寄存器(内存访问)
    • 第4章 第一个程序
      • 4.1 一个源程序从写出到执行的过程
      • 4.2.源程序
      • 4.3 谁将可执行文件中的程序装载入内存并使它运行?
      • 4.4 程序执行过程的追踪
    • 第5章 [BX]和loop指令
    • 第6章 包含多个段的程序
    • 第7章 更灵活的定位内存地址的方法
    • 第8章 数据处理的两个基本问题
  • STM32

  • 嵌入式软件开发
  • 汇编语言
霜晨月
2024-07-24
目录

第4章 第一个程序

# 第4章 第一个程序

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

  • 第一步:编写汇编程序
  • 第二步:对源程序进行编译连接
  • 第三步:执行可执行文件中的程序

# 4.2.源程序

汇编语言中包含两种指令:汇编指令 和 伪指令

  • 汇编指令:有对应机器码的指令,最终被 CPU 执行
  • 伪指令:由编译器进行执行,进行相关的编译动作

伪指令:

image

源程序中的程序

将源程序文件中所有内容称之为源程序,然后通过编译连接后转变为机器码,存储在可执行文件中

image

mov ax,4c00H
int 21H
1
2

在程序末尾使用这两条指令就可以实现程序返回

标号

一个标号指代了一个地址,例如:codesg 在 segment 的前面,作为一个段的名称,这个段的名称最终会编译一个段的段地址。

image

任务:编程运算 2*3。源程序应该怎样来写?

assume cs:abc
abc segment
	mov ax,2
	mov ax,ax
	mov ax,ax
	
	mov ax,4c00H
	int 21H
abc ends
end
1
2
3
4
5
6
7
8
9
10

image

# 4.3 谁将可执行文件中的程序装载入内存并使它运行?

在 DOS 中,可执行文件中的程序 P1 若要运行,必须有一个正在运行的程序 P2 ,将 P1 从可执行文件中加载入内存,将 CPU 的控制权交给它,P1 才能得以运行;当 P1 运行完毕后,会将 CPU 的控制权交还给使它得以运行的程序 P2。

这个 P2 程序就是 command.com(命令解释器),也就是 DOS 系统的 shell。具体可看下图。

image

image

# 4.4 程序执行过程的追踪

在 DOS 中运行一个程序时,command 将程序从可执行文件中加载入内存并使其运行,之后就放弃了 CPU 的控制权,并不能对程序的执行过程进行跟踪分析,所以这时需要使用到 Debug。Debug 也可以将程序加载如内存,设置 CS : IP 指向程序的入口,但 Debug 并不放弃对 CPU 的控制,这样就可以使用 Debug 相关的命令来单步执行程序,查看每一条指令的执行结果。但最后还是会把 CPU 控制权交还给 command。

  • 使用 Debug 命令
    • 程序加载的顺序:command 加载 Debug,Debug 加载 1.exe 。
    • 返回的顺序是:1.exe 返回到Debug,从 Debug 返回到 command。

图4.20解释在 DOS 系统中的程序的加载过程。

图4.20

调试命令:(不区分大小写)

  • 输入R:查看各个寄存器的设置情况
  • 输入U:查看此程序其他指令
  • 输入T:单步执行程序中的每一条指令
  • 输入Q:退出 Debug 模式
第3章 寄存器(内存访问)
第5章 [BX]和loop指令

← 第3章 寄存器(内存访问) 第5章 [BX]和loop指令→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式