汇编入门基础

编写流程

  • 定义一个段

  • 实现处理任务

  • 指出程序在何处结束

  • 段与段寄存器关联

  • 加上程序返回代码

    • 示例如下:

      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.mfbz.cn/a/889169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五款专业三维数据处理工具:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣深度解析

随着三维数据处理技术的广泛应用,尤其是在城市规划、地理信息系统(GIS)、工程监测等领域,处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OS…

Kubernetes(K8s)的简介

一、Kubernetes的简介 1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个阶段: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应…

C语言预处理详解(下)(31)

文章目录 前言一、命令行定义二、条件编译三、文件包含头文件被包含的方式嵌套文件包含 总结 前言 再介绍几点吧! 一、命令行定义 许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程 当我们根据同一个源文件要编译出不同的一个程序…

太速科技-607-基于FMC的12收和12发的光纤子卡

基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡(FMC)模块,可提供高达2个CXP模块接口,提供12路收,12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议,可以组成X4&#xff0…

中间件介绍

可以把中间件想象成是在应用和系统之间搭建的一座桥梁,或者说是一个“翻译官”和“中转站”。它处在操作系统、网络和数据库之上,应用软件的下层,负责实现应用软件之间的互联互通,使得应用软件能够更方便、高效地进行数据交换和通…

2024最新CSDN Markdown编辑器语法教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包,用于将 R 代码转换为 Web API,通过使用 plumber&#x…

cmake --build使用踩坑记录

根据 深入理解 CMake 的 cmake --build 命令_cmake build-CSDN博客等消息来源的说法&#xff0c; cmake --build <dir> 将在目录<dir>中产生结果文件。但是实测发现&#xff0c;这里有坑&#xff1a;如果目录<dir>中没有CMakeCache.txt等文件的话&#xff…

高性能缓存方案 —— Caffeine

一、简介 Caffeine是一个高性能的Java缓存库&#xff0c;它提供了本地缓存的功能。 Caffeine和Redis都是内存级别的缓存&#xff0c;为什么要使用在这两缓存作为二级缓存&#xff0c;它们两有什么区别呢? 虽然它们都是内存级别的缓存&#xff0c;但是Redis是需要单独部署的&…

RPA技术的定义与原理

RPA&#xff08;Robotic Process Automation&#xff09;即机器人流程自动化&#xff0c;是一种利用软件机器人或机器人工具来自动执行重复性、规则性和可预测性的业务流程的技术。以下是对RPA技术的详细介绍&#xff1a; 一、RPA技术的定义与原理 RPA技术通过模拟人工操作&a…

ORA-01031: insufficient privileges一次特殊的权限不足故障

在一个19C的数据库下,有多个PDB,我们使用公共用户c##xxx连接到不同的pdb的时候,发现其中一个pdb无法truncate表,其它pdb都是正常的,手工在pdb内赋予此公共用户dba和sysdba权限都不行: 最后发现是这个用户的default role默认角色的问题,简单介绍一下default role: 当给用户赋予…

【Redis入门到精通十】Redis哨兵

目录 哨兵&#xff08;Sentinel&#xff09; 1.哨兵的由来 2.哨兵的基本概念 3.基于docker安装配置Redis哨兵 4.哨兵选取主节点的原理 1.主观下线 2.客观下线 3.选举出哨兵的leader 4.leader挑选出合适的slave成为新的master 哨兵&#xff08;Sentinel&#xff09; Red…

掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构

1 MQ介绍 MQ(Message Quene) : 翻译为 消息队列,别名为 消息中间件&#xff0c;通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c…

C语言 | Leetcode C语言题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…

Windows环境安装CentOS7

【注意】安装CentOS需要先安装Vmware虚拟机 【下载前准备】 一、下载CentOS 7镜像文件阿里云镜像开源&#xff0c;点击跳转 二、安装VMware&#xff08;17&#xff09;&#xff1a; a. 官网&#xff0c;点击跳转 b. 许可证&#xff1a;JU090-6039P-08409-8J0QH-2YR7F 安装V…

美国1米DEM地形瓦片数据免费分享(4)-新泽西州

一、简要介绍 新泽西州(英语:State of New Jersey)位于美国中大西洋地区&#xff0c;其命名源自位于英吉利海峡中的泽西岛&#xff0c;昵称为“花园州”。新泽西州亦为美国东部的一个州&#xff0c;北接纽约州&#xff0c;东面大西洋&#xff0c;南向特拉华州&#xff0c;西临…

图片批量转格式png转jpg,这几种转换方法看一遍就学会

在日常工作和学习中&#xff0c;我们经常需要处理各种图片格式&#xff0c;尤其是PNG和JPG这两种最为常见。PNG格式因其无损压缩和透明度支持而备受欢迎&#xff0c;但在某些场合下&#xff0c;JPG格式因其更高的压缩率和更广泛的兼容性更为适用。今天&#xff0c;就为大家介绍…

A CXL-Powered Database System: Opportunities and Challenges——论文阅读

ICDE 2024 Paper CXL论文阅读笔记整理 背景 Compute Express Link&#xff08;CXL&#xff09;是处理器和设备&#xff08;如内存缓冲区&#xff09;之间的开放式行业标准互连协议&#xff0c;基于CXL的内存架构如图1所示&#xff0c;拥有高带宽、低延迟以及对一致性和内存语…

深入理解 CSS 浮动(Float):详尽指南

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;目录1. 什么是 CSS 浮动&#xff1f;2. CSS 浮动的历史背景3. 基本用法float 属性值浮动元素的行为 4. 浮动对文档流的影响5. 清除浮动clear 属性清除浮动的技巧1. 使用…

SpringBoot 多元化配置(正则表达式,配置文件优先级)

1.配置绑定 所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常&#xff0c;我们会把一些配置信息&#xff08;例如&#xff0c;数据库配置&#xff09;放在配置文件中&#xff0c;然后通过 Java 代码去读取该配置文件&#xff0c;并且把配置文件中…