汇编入门基础

ops/2024/10/11 9:18:34/

编写流程

  • 定义一个段

  • 实现处理任务

  • 指出程序在何处结束

  • 段与段寄存器关联

  • 加上程序返回代码

    • 示例如下:

      assume cs:abc
      abc segmentmov 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 segmentmov 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 segmentmov ax,2mov cx,11
s:  add ax,ax		; s为标号loop smov ax, 4c00hint 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 segmentdw 0123h,0456h,0789h,0abchstart:			; 标识代码开始的位置mov bx,0mov ax,0mov cx,8s: add ax, cs:[bx]add bx,2loop smov ax, 4c00hint 21h
code ends
end start		; 标识代码结束的位置

示例代码

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

assume cs:code
code segmentmov ax,0ffffhmov ds,axmov bx,0mov dx,0mov cx,12s:  mov al,[bx]mov ah,0add dx,axinc bxloop smov ax, 4c00hint 21h
code ends
end

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

; 采用附加寄存器
assume cs:code
code segmentmov ax,0ffffhmov ds,axmov ax,0020hmov es,ax		; 使用附加寄存器mov bx,0mov cx,12s:  mov dl,[bx]mov es:[bx],dlinc bxloop smov ax,4c00hint 21h
code ends
end

将数据逆序存放

assume cs:codesg
codesg segmentdw 0123h,0456h,0789h,0abch,0def,0fedh,0cbah,0987hdw 0,0,0,00,0,0,0,0,0,0,0,0,0,0,0start: mov ax,csmov ss,axmov sp,30hmov bx,0mov cx,8s:push cs:[bx]add bx,2loop smov bx,0mov cx,8s0:pop cs:[bx]add bx,2loop s0mov ax, 4c00hint 21h
codesg ends
end start

http://www.ppmy.cn/ops/123912.html

相关文章

threading模块中的自定义线程Thread

自定义线程:步骤: 1.继承Thread2.重写__init__方法添加自己的属性,使用super加载父类属性,3.重写run方法使用方法:1.实例化对象2.调用start自动执行run方法3.调用join回收线程 t.start()启动线程,则就会…

HUAWEI_HCIA_实验指南_Lib1.6_配置通过FTP进行文件操作

1、原理概述 FTP(File Transfer Protocol,文件传输协议)是在TCP/IP网络和Internet上最早使用的协议之一,在TCP/IP协议族中属于应用层协议,是文件传输的Internet标准。其主要功能是向用户提供本地和远程主机之间的文件传输,尤其是在进行版本升级、日志下载和配置保存等业务…

使用激光跟踪仪提升码垛机器人精度

标题1.背景 码垛机器人是一种用于工业自动化的机器人,专门设计用来将物品按照一定的顺序和结构堆叠起来,通常用于仓库、物流中心和生产线上,它们可以自动执行重复的、高强度的搬运和堆垛任务。 图1 码垛机器人 传统调整码垛机器人的方法&a…

【分布式微服务云原生】掌握分布式缓存:Redis与Memcached的深入解析与实战指南

掌握分布式缓存:Redis与Memcached的深入解析与实战指南 摘要: 本文深入探讨了分布式缓存在现代分布式系统中的重要性,详细分析了Redis和Memcached两种主流的分布式缓存解决方案的原理和使用场景。文章不仅提供了核心技术的深入解析&#xff…

视频怎么去除杂音保留人声?让人声更动听!视频噪音处理攻略

在视频制作过程中,音质是至关重要的一环。然而,很多时候我们录制的视频会伴随着各种不想要的杂音,比如风声、交通噪音或是其他环境音,这些杂音严重影响了观众的观看体验。那么,如何在保留人声的同时,有效地…

每天一个数据分析题(四百九十九)- 数据集

考虑下面的频繁3-项集的集合:{1,2,3},{1,2,4},{1,2,5},{1,3,4},{1,3,5},{1&#xff0c…

前后分离项目记录

一.前端设置 1.打包问题 打包报错 Thread Loader时,增加以下代码: 上线,打包prod时: 2.上线时api设置 二.Nginx问题 1.缓存问题:添加如下代码以禁止缓存,否则在关闭nginx后仍然可以访问页面 2.跨域问题在后端加Cr…

毕业设计选题:基于php+vue+uniapp的新闻资讯小程序

开发语言:PHP框架:phpuniapp数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:PhpStorm 系统展示 管理员登录界面 管理员功能界面 新闻类别管理 新闻信息管理 用户管理 管理员管…