ch3_1汇编语言程序的源程序

news2024/12/23 23:50:48

mark 一下, 2023.Aug.15 从湖北返回学习,参加了一场学术会议, 看来做学术确实是需要交流的, 尤其该领域的多交流, 还是需要至少一年参加一次学术会议.

不至于让自己太孤陋寡闻, 局限于自己狭隘的领域内,多看看目前学术界的进展.

1. 用汇编语言写的源程序

1.1 用汇编语言编写程序的工作过程

汇编程序:包含汇编指令和伪指令的文本’

  • 汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被
    CPU执行.

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

:谁来执行伪指令呢?
伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作.

在这里插入图片描述

assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end

程序返回(套路!):程序结束运行后,将CPU的控制权交还给使它得以运行的程序(常为DOS系统)

1.2程序中的三种伪指令

  • assume(假设)

; 含义是假设某一段寄存器和程序中的某一个用 segment … ends 定
义的段相关联——assume cs:codesg指CS寄存器与codesg关联,将
定义的codesg当作程序的代码段使用。

  • 段定义

; 一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。
; 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
; 定义程序中的段:每个段都需要有段名

段名 segment ——段的开始

段名 ends ——段的结束

  • end (不是ends)

汇编程序的结束标记。若程序结尾处不加end,编译器在编译程序时,无法知道程序在何处结束。

assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end

1.3 源程序经编译连接后变为机器码

在这里插入图片描述

1.4 汇编程序的结构

  • 在Debug中直接写入指令编写的汇编程序
    ; 适用于功能简单、短小精悍的程序
    ; 只需要包含汇编指令即可

在这里插入图片描述

  • 单独编写成源文件后再编译为可执行文件的程序
    ; 适用于编写大程序
    ; 需要包括汇编指令,还要有指导编译器工作的伪指令
    ; 源程序由一些段构成,这些段存放代码、数
    据,或将某个段当作栈空间
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
mov ax,stack
mov ss,ax
mov sp,20h ;设置栈段
mov ax,data
mov ds,ax ;设置数据段
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
....
code ends
end

; 分号,用来代表-- 注释

1.5 如何写出一个程序来?

例:编程求 2^3。
①定义一个段
②实现处理任务
③指出程序在何结束
④段与段寄存器关联
⑤加上程序返回的代码

在这里插入图片描述

1.6程序中可能的错误

语法错误
; 程序在编译时被编译器发现的错误;
; 容易发现下面程序中错误

aume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,sx
end

逻辑错误
; 程序在编译时不能表现出来的、在运行时
发生的错误;
; 不容易发现下面程序中的错误

assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,bx
mov ax,4c10H
int 21H
abc ends
end
求 2^

2. 由源程序到程序运行

2.1 由写出源程序到执行可执行文件的过程

在这里插入图片描述

2.2 编辑源程序

在这里插入图片描述

2.3 编译

在这里插入图片描述

  • 目标文件(*.OBJ)是我们对一个源程序进行编译要
    得到的最终结果。

  • 列表文件(*.LST)是编译器将源程序编译为目标文件的过程中产生的中间结果。

  • 交叉引用文件(*.CRF)同列表文件一样,是编译器将源程序编译为目标文件过程中产生的中间结果。

  • 对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序没有警告错误和必须要改正的错误。

在这里插入图片描述

两类错误
û Severe Errors
û 找不到所给出的
源程序文件。
命令后加 ; 以简化过程

2.4 连接

  • 可执行文件(.EXE)是我们对一个程序进行连接要得到的最终结果。

  • 映像文件(.MAP)是连接程序将目标文件连接为可执行文件过程中产生的中间结果。

  • 库文件(.LIB)里包含了一些可以调用的子程序,如果我们的程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和我们的目标文件连接到一起,生成可执行文件。

  • no stack segment,一个“没有栈段”的警告错误 ,可以不理会这个错误。

:连接中可能会遭遇错误
:例:object nor found —— 找不到对象

在这里插入图片描述

2.5 执行可执行程序

在这里插入图片描述

我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能
从显示屏上看出来。

:程序执行完成后,返回,屏幕上再次出现操作系统的提示符。

2.6 小结

源文件
.asm
目标文件
.obj
目标文件
.obj
可执行文件
.exe

在这里插入图片描述

3. 用Debug跟踪程序的执行

在这里插入图片描述

3.1 用Debug装载程序

在这里插入图片描述

小结

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

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

从 256字节处向后的空间存放的是程序,CS的值为DS+10H。
; 程序加载后,CX中存放代码的长度(字节)。

程序被装入内存的什么地方?

在这里插入图片描述

3.2 用Debug单步执行程序

在这里插入图片描述

3.3 其他方式执行

在这里插入图片描述

  • 继续命令P(Proceed):
    类似T命令,逐条执行指令、显示结果。但遇子程序、中断等时,直接执行,然后显示结果。

  • 运行命令G(Go):从指定地址处开始运行程序,直到遇到断点或者程序正常结束。

3.4 程序执行的不同方式

  • 在DOS中执行

程序执行的“常态”

  1. DOS启动后,计算机由“命令解释器”(程序command.com)控制;
  1. 运行可执行程序时,command将程序加载入内存,设置CPU的CS:IP指向程序的第一条指令(即程序的入口),使程序得以运行。
  1. 程序运行结束后,返回到“命令解释器”,CPU继续运行command。
  • 在Debug中执行

程序执行处于开发周期的运行方式;
在这里插入图片描述

运行Debug时,command程序加载Debug.exe,debug 将程序加载入内存,程序运行结束后,
要返回到Debug中,使用Q命令退出Debug,将返回到command中。

在这里插入图片描述

书本章节对应

在这里插入图片描述

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

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

相关文章

小程序如何手动变更会员卡等级

有时候需要商家手动变更会员卡等级,以让会员获取更多的福利和特权。下面就介绍一些小程序手动变更会员卡等级的常见方法和策略。 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要更改等级的会员卡。也支持对会员卡按卡号、手机号和等级进行…

宝塔计划任务读取文件失败

想挂计划任务 相关文章【已解决】计划任务读取文件失败 - Linux面板 - 宝塔面板论坛 对方反馈的是执行下面的命令 chattr -ai /var/spool/cron 后来发现直接没有这个文件夹,然后通过mkdir命令创建文件夹,成功在宝塔创建了计划任务 后面发现任务虽然添…

Markdown初级使用指南

前言 大家好,我是艾老虎尤,我在一篇官方的文章中,我了解到了markdown,原本我写博客一直是使用的富文本编译器,之前我也有同学叫我使用MD,但是我嫌它复杂,就比如说一个标题,我在富文…

SFM structure from motion

struction就是空间三维点的位置 motion 就是相机每帧的位移 https://www.youtube.com/watch?vUhkb8Zq-dnM&listPL2zRqk16wsdoYzrWStffqBAoUY8XdvatV&index9

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的? 蜂鸣器 是 一种 一体化结构 的电子训响器,可以发出声音的电子元器件 蜂鸣器分类? ①压电式蜂鸣器(图左) 称: 无源蜂鸣器 ②电磁式蜂鸣器(图右) 称&#xf…

ISIS路由协议

骨干区域与非骨干区域 凡是由级别2组建起来的邻居形成骨干区域;级别1就在非骨干区域,骨干区域有且只有一个,并且需要连续,ISIS在IP环境下目前不支持虚链路。 路由器级别 L1路由器只能建立L1的邻居;L2路由器只能建立L…

SpringCloud学习笔记(十)_SpringCloud监控

今天我们来学习一下actuator这个组件,它不是SpringCloud之后才有的,而是SpringBoot的一个starter,Spring Boot Actuator。我们使用SpringCloud的时候需要使用这个组件对应用程序进行监控与管理 在SpringBoot2.0版本中,actuator可以…

TensorFlow中slim包的具体用法

TensorFlow中slim包的具体用法 1、训练脚本文件(该文件包含数据下载打包、模型训练,模型评估流程)3、模型训练1、数据集相关模块:2、设置网络模型模块3、数据预处理模块4、定义损失loss5、定义优化器模块 本次使用的TensorFlow版本…

电商项目part07 订单系统的设计与海量数据处理

订单重复下单问题(幂等) 用户在点击“提交订单”的按钮时,不小心点了两下,那么浏览器就会向服务端连续发送两条创建订单的请求。这样肯定是不行的 解决办法是,让订单服务具备幂等性。什么是幂等性?幂等操作的特点是&a…

Vue2向Vue3过度Vue3组合式API

目录 1. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势3 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 4 熟悉项目和关键文件5 组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖 6 组合式…

Cpp学习——编译链接

目录 ​编辑 一&#xff0c;两种环境 二&#xff0c;编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三&#xff0c;执行环境 一&#xff0c;两种环境 在程序运行时会有两种环境。第一种便是编译环境&#xff0c;第二种则是执行环境。如下图&#xff1a; 在程序运…

wxpython:wx.html2 是好用的 WebView 组件

wxpython : wx.html2 是好用的 WebView 组件。 pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.2.0 cd \Python37\Scripts wxdemo.exe 取得 wxPython-demo-4.2.0.tar.gz wxdocs.exe 取得 wxPython-docs-4.…

Android平台RTMP|RTSP直播播放器功能进阶探讨

我们需要怎样的直播播放器&#xff1f; 很多开发者在跟我聊天的时候&#xff0c;经常问我&#xff0c;为什么一个RTMP或RTSP播放器&#xff0c;你们需要设计那么多的接口&#xff0c;真的有必要吗&#xff1f;带着这样的疑惑&#xff0c;我们今天聊聊Android平台RTMP、RTSP播放…

STM32f103入门(1) 配置点亮Led灯

1 安装keil5 MDK 双击 MDK524a.EXE安装成功后管理员模式打开CID复制到破解软件 选择ARM生成代码复制到New License ID CodeAdd LIC破解完毕 2安装stm32芯片 可找资料自行安装 如下 3 创建工程 Project->new project 本篇芯片为stm32f103保存到自定义文件夹下在根目录下…

JavaScript立即执行函数(自执行函数)的3种写法

一、什么是立即执行函数 顾名思义&#xff0c;声明一个函数并马上调用这个函数就叫做立即执行函数&#xff1b;也可以说立即执行函数是一种语法&#xff0c;让你的函数在定义以后立即执行&#xff1b;立即执行函数又叫做自执行函数。 二、立即执行函数的写法 立即执行函数的…

快速排序笔记

一、quick_sort方法中如果 il,jr 会死循环的分析 1、示例代码 void quick_sort(int a[],int l,int r){if(l>r) return;int il,jr; //此处设置会导致死循环int x num[(lr)>>1];while(i<j){while(a[i] <x); //死循环的地方while(a[--j] >x);if(i<j) swap(a…

RabbitMQ---订阅模型-Direct

1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中&#xff0c;生产者发布消息&#xff0c;所有消费者都可以获取所有消息。 • 在路由模式中&#xff0c;我们将添加一个功能 - 我们将只能订阅一部分消息。 例如&#xff0c;我们只能将重要的错误消息引导到日志文件…

网站常见安全漏洞 | 青训营

Powered by:NEFU AB-IN 文章目录 网站常见安全漏洞 | 青训营 网站基本组成及漏洞定义服务端漏洞**SQL注入****命令执行****越权漏洞****SSRF****文件上传漏洞** 客户端漏洞**开放重定向****XSS****CSRF****点击劫持****CORS跨域配置错误****WebSocket** 网站常见安全漏洞 | 青训…

软件架构业务及技术复杂度分析总结

目录 一、综述分析 二、业务复杂性分析 &#xff08;一&#xff09;领域建模 &#xff08;二&#xff09;领域分层 &#xff08;三&#xff09;服务粒度 &#xff08;四&#xff09;流程编排 三、技术复杂性分析 &#xff08;一&#xff09;高可用 底层逻辑 CAP原则 …

Mac OS 13.4.1 搜狗输入法导致的卡顿问题

一、Mac OS 系统版本 搜狗输入法已经更新到最新 二、解决方案 解决方案一 在我的电脑上面需要关闭 VSCode 和 Chrmoe 以后&#xff0c;搜狗输入法回复正常。 解决方案二 强制重启一下搜狗输入法。 可以用 unix 定时任务去隔 2个小时自动 kill 掉一次进程 # kill 掉 mac …