汇编入门基础

news2024/10/10 20:21:29

编写流程

  • 定义一个段

  • 实现处理任务

  • 指出程序在何处结束

  • 段与段寄存器关联

  • 加上程序返回代码

    • 示例如下:

      assume cs:abc
      abc segment
      	mov ax,2
      	...
      	mov ax,4c00h	; 此行与下一行为返回代码
      	int 21h
      abc ends
      end
      

栈定义

push,pop是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同之处在于,push和pop指令访问的内存单元的地址不是在指令中给出,而是由SS:SP指出。

  • 执行push和pop指令时,SP中的内容会自动改变

  • push(入栈)和pop(出栈)指令

  • push ax: 将ax中的数据送入栈中

    SP = SP - 2;

    将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

  • pop ax: 从栈顶取出数据送入ax

    将SS:SP指向的内存单元处的数据送入ax中

    SP = SP+2, SS:SP指向当前栈顶下面的单元,以当前栈顶下的单元为新的栈顶

栈寄存器
  • 栈段寄存器SS – 主要存放栈顶的段地址

  • 栈顶指针寄存器SP – 存放栈顶的偏移地址

    任意时刻,SS:SP指向栈顶元素

注意: SS指向的是栈内存起始地址,SP指向从起始地址至偏移的地址,当添加数据时是移动SP指针进行偏移,但是SP指向的最终位置,于是栈内存的增长是由低至高。

需要特别注意栈顶指针越界的情况。

段定义

  • 一个汇编程序是由多个段组成,这些段被用来存放代码,数据或当作栈空间使用。

  • 一个有意义的汇编程序中至少要有一个段,该段用以存放代码。

  • 定义程序中的段:每个段都需要有段名。

    • 段名 segment – 程序段起始
    • 段名 ends – 程序结束

    示例如下:

    assume cs:codesg
    codesg segment
    	mov ax, 123H
    	.....
    codesg ends
    end
    
  • end:汇编程序的结束标记,若程序结尾不加end,编译器在编译程序时,无法知道程序在何处结束。

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

编译文件

  • 目标文件(*.OBJ) 对源程序进行编译要得到的最终结果。
  • 列表文件(*.LST) 编译器将源程序编译为目标文件的过程中产生的中间结果。
  • 交叉引用文件(*.CRF) 编译器将源程序编译为目标文件过程中产生的中间结果。

[]与()的约定

  • [] – 表示一个内存单元。

  • () – 表示一个内存单元或寄存器中的内容。

  • 一个内存单元包含内存单元的地址和内存单元的长度(类型),内存单元的地址包含段地址和偏移地址。

  • 例如:

    ax中的内容为0010H,解释为(ax) = 0010H

    mov ax,[2],解释为(ax) = ((ds) * 16 + 2)

Loop指令

功能:实现循环。

指令格式

  • loop 标号

CPU执行loop指令时要进行的操作:

  • (cx) = (cx) - 1;
  • 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

示例如下:

assume cs:code
code segment
	mov ax,2
	mov cx,11
s:  add ax,ax		; s为标号
	loop s
	mov ax, 4c00h
	int 21h
code ends
end

注意: cx寄存器中要存放循环次数,因为cx寄存器影响loop指令的执行结果。

编写要点:

  • 在cx中存放循环次数。
  • 用标号指定循环开始的位置。
  • 在标号和loop指令的中间,写上要循环执行的程序段(循环体)。

段前缀异常及对策

出现在访问内存单元的指令当中,用于显式地指明内存单元的段地址的"ds:",“cs:”,“ss:”,“es:”,在汇编当中称为段前缀。

例如:

mov al,[0] ;是将DS:0的数据传递给al寄存器
mov al, 0  ; 但编译之后的可能是直接将0传递给了寄存器

以上情况需要在[idata]前显式地写上段寄存器

mov ax,2000h
mov ds,ax
mov bx,0
mov al,[ds:][bx]

汇编代码结构

assume cs:code
code segment
	;....
begin:		; 标识代码开始的位置
	;....
code ends
end begin	; 除了通知编译器程序结束外,还可通知编译器程序入口地址

例如:

assume cs:code
code segment
	dw 0123h,0456h,0789h,0abch

start:			; 标识代码开始的位置
	mov bx,0
	mov ax,0
	mov cx,8
	
	s: add ax, cs:[bx]
	   add bx,2
	   loop s
	 	
	   mov ax, 4c00h
       int 21h
code ends
end start		; 标识代码结束的位置

示例代码

循环中要访问的内存单元的偏移地址放到bx中,随循环递增,访问连续的内存单元。

assume cs:code
code segment
	mov ax,0ffffh
	mov ds,ax
	
	mov bx,0
	mov dx,0
	mov cx,12
	
s:  mov al,[bx]
	mov ah,0
	add dx,ax
	inc bx
	loop s
	
	mov ax, 4c00h
	int 21h
code ends
end

将内存ffff:0–ffff:b中的数据拷贝到0:200–0:20b中

; 采用附加寄存器
assume cs:code
code segment
	mov ax,0ffffh
	mov ds,ax
	mov ax,0020h
	mov es,ax		; 使用附加寄存器
	
	mov bx,0
	mov cx,12
	
s:  mov dl,[bx]
	mov es:[bx],dl
	inc bx
	loop s
	
	mov ax,4c00h
	int 21h
code ends
end

将数据逆序存放

assume cs:codesg
codesg segment
	dw 0123h,0456h,0789h,0abch,0def,0fedh,0cbah,0987h
	dw 0,0,0,00,0,0,0,0,0,0,0,0,0,0,0

start: mov ax,cs
	   mov ss,ax
	   mov sp,30h
	   mov bx,0
	   mov cx,8
	   
	 s:push cs:[bx]
	   add bx,2
	   loop s
	   
	   mov bx,0
	   mov cx,8
	s0:pop cs:[bx]
	   add bx,2
	   loop s0
	   
	   mov ax, 4c00h
	   int 21h
codesg ends
end start

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

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

相关文章

【读书笔记·VLSI电路设计方法解密】问题9:什么是SOC发展趋势的推动力

推动SoC趋势的主要力量之一是成本。将更多功能集成到单一芯片中可以减少系统中的芯片数量,从而缩小封装和电路板的成本。这可能会降低整个系统的成本,使产品更具竞争力。在当今的消费电子市场和其他市场中,较低的价格总能带来获得市场份额的优…

激光避障的运行算法!

一、激光传感器的工作原理 激光避障技术利用激光束的直线传播和反射特性,通过发送激光束并接收反射回来的信号,来检测和计算周围障碍物的距离和位置。激光传感器能够生成高精度的距离数据和三维环境信息,为机器人或无人机提供详细的障碍物分…

留学期间如何提高职业竞争力?

留学期间是提高职业竞争力的关键时期,以下是一些具体的建议,帮助留学生在留学期间增强自身的职业竞争力: 一、深化专业知识与技能 1. 专注于课程学习:努力学习专业课程,掌握扎实的专业知识,这是提高职业竞…

qiankun 主项目和子项目都是 vue2,部署在同一台服务器上,nginx 配置

1、主项目配置 1.1 micro.vue 组件 <template><div id"container-sub-app"></div> </template><script> import { loadMicroApp } from qiankun; import actions from /utils/actions.js;export default {name: microApp,mixins: [ac…

颠覆传统!团购新玩法带你零风险狂赚社交红利

你是否曾经被某个看似大胆且充满挑战的商业策略深深吸引&#xff0c;最终却惊喜地发现它在短时间内创造了惊人的价值&#xff1f;今天&#xff0c;我们将一起探索一个别出心裁的商业模式&#xff0c;看看它是如何在短短一个月内实现超过600万的利润奇迹。这不仅仅是一次对商业机…

第十一章:规划过程组 (11.1制定项目管理计划--11.5创建WBS)

11.1 制定项目管理计划 • 项目管理计划可以是概括或详细的&#xff0c;每个组成部分的详细程度取决于具体项目的要求 • 项目管理计划应基准化&#xff0c;即至少应规定项目的范围、时间和成本方面的基准以便据此考核项目执行情况和管理项目绩效。 • 在确定基准之前&#xf…

前端开发攻略---分块加载大数据

一、问题 解决当遇到较大的数据请求&#xff0c;当用户网络较差的时候&#xff0c;需要等很久很久才能拿到服务器的响应结果&#xff0c;如果这个响应结果需要再页面上展示的话&#xff0c;会导致页面长时间白屏的问题 二、实现原理 当发送一个请求时&#xff0c;需要等服务器把…

UM-Net: 重新思考用于息肉分割的ICGNet,结合不确定性建模|文献速递-基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 UM-Net: Rethinking ICGNet for polyp segmentation with uncertainty modeling UM-Net: 重新思考用于息肉分割的ICGNet&#xff0c;结合不确定性建模 01 文献速递介绍 结直肠癌&#xff08;CRC&#xff09;是男性中第三大、女性中第二大常见的恶性肿瘤&#x…

python+pytest+request 接口自动化测试

一、环境配置 1.安装python3 brew update brew install pyenv 然后在 .bash_profile 文件中添加 eval “$(pyenv init -)” pyenv install 3.5.3 -v pyenv rehash 安装完成后&#xff0c;更新数据库 pyenv versions 查看目前系统已安装的 Python 版本 pyenv global 3.5…

[实用工具]Docker安装nextcloud实现私有云服务和onlyoffice

Nextcloud是一款开源的云存储和协作平台&#xff0c;允许用户在自己的服务器上存储和访问文件&#xff0c;同时提供强大的协作工具。它可以替代商业云存储服务&#xff0c;让用户拥有完全控制和自主管理自己的数据。 Nextcloud支持文件上传和下载&#xff0c;可以通过Web界面、…

Android实现RecyclerView宽度变化动画

效果图 实现思路就是定义一个属性动画&#xff0c;在动画监听器中不断修改RecyclerView的宽度 valueAnimator ValueAnimator.ofInt(begin, recyclerView.getWidth() * 2);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {Overridepublic void …

EasyAnimate

https://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.mdhttps://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.md EasyAnimate v4是一个用于生成高分辨率和长视频的端到端解决方案。我们可以训练基于转换器的扩散生成器,训练用于处理长视频的VAE,…

python35_控制台简单计算年薪

控制台简单计算年薪 def calculate_annual_salary(monthly_salaries):"""计算年薪。参数:monthly_salaries: list of float&#xff0c;每个月的工资列表。返回值:float&#xff0c;用户的年薪。"""annual_salary sum(monthly_salaries)return…

论文作者署名排序是怎么界定的?

人人都想在论文的作者名单中占个位子&#xff0c;特别是一作和通讯作者&#xff0c;我也经常会收到一些人的哭诉&#xff0c;说自己明明做了大部分的工作&#xff0c;但却让别人的名字挂在第一作者。 在厘清一作与通讯作者的意义之前&#xff0c;我们先来看看谁可以署名。目前国…

经典蓝牙BLE版本区别:【图文讲解】

蓝牙是一种短距的无线通讯技术&#xff0c;可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙&#xff0c;而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙&#xff08;BLE&#xff09;。 1&#xff1a;蓝牙4.0 BLE 4.0版本是3.0版本的升级版本&a…

MySQL 初探:从基础到优化

什么是 MySQL&#xff1f; MySQL 是一个开源的关系型数据库管理系统 (RDBMS)&#xff0c;使用结构化查询语言 (SQL) 进行数据管理。作为最流行的数据库之一&#xff0c;MySQL 被广泛应用于各类网站和应用中&#xff0c;从小型应用到大型复杂系统。 MySQL 的特点 开源免费&am…

antdv树形表格 大量tooltip等组件导致页面卡顿问题优化

vue3、ant-design-vue 4.2.3 遇到的问题&#xff1a;页面中有个展示树形数据的表格&#xff0c;默认需要全部展开&#xff0c;有一组数据量较大时页面首次渲染时非常卡顿&#xff0c;发现每次都大概用了7、8秒才完成渲染。表格展开的数据大概300条数据&#xff0c;操作列中有5…

SpringBoot框架下的服装生产管理系统

1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高…

leetcode:反转字符串中的单词III

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseWords(string s) {string s1; int i 0; int j 0; int length s.length(); for (i …

2024年【金属非金属矿山(地下矿山)安全管理人员】复审考试及金属非金属矿山(地下矿山)安全管理人员在线考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员复审考试考前必练&#xff01;安全生产模拟考试一点通每个月更新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员在线考试题目及答案&#…