当前位置: 首页 > news >正文

汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

目录

前提知识

案例 

c的插入排序

32位汇编代码

代码分析

效果展示


前提知识

  • 常用指令

add指令
sub指令
mul乘法指令
div除法指令
inc(自增)(即++)
dec(自减)(即--)

cmp(比较)

  • 寄存器

EAX:累加器
多用于存放中间运算结果
EBX:基址寄存器
在间接寻址中用于存放基地址
ECX:计数寄存器
用于在循环或串操作指令中存放循环次数或重复次数;
EDX:数据寄存器
在32位乘除法运算时,存放高32位数
  • 分支结构
比较指令:
cmp x,y
跳转指令:
jmp, jXXX(ja, jb, jz)
cmp x, y 语义:
执行操作 x-y (xy的值不变),根据操作结果改 变EFLAG相应的位。
ja loc: xy是无符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行
jz/je loc: xy是无符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行
jb loc: xy是无符号数(程序员定义)且 x<y,则程序跳转到地址loc处执行
jg loc: xy是有符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行
jz/je loc: xy是有符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行
jl loc: xy是有符号数(程序员定义)且 x<y,则程序跳转到地址loc处执行
  • 输出输入
数据移送指令:mov dest,src
函数调用指令:Call f
输入输出函数
ReadInt PROC uses ebx ecx edx esi
输入:无
返回值:
CF=0, 输入存在EAX
CF=1, 输入无效,EAX=0
WriteInt proc
输入:显示的整数存在EAX
返回值: 无
  • 基础格式
INCLUDE Irvine32.inc
.data
.code
final:
exit
main ENDP
END main

案例 

c的插入排序

void InsertSortArray ( int arr[], int n){
int arr[]={2,99,3,1,22,88,7,77,54};
for (int i = 1; i < n; i++){
int temp = arr[i];
while (i >= 0 && arr[i - 1] > temp){
arr[i] = arr[i - 1];
i--;
}
arr[i] = temp;
}
}

32位汇编代码

INCLUDE Irvine32.inc
.data
arr dd 2,99,3,1,22,88,7,77,54
arr_len dd 9
a dd 1 ;直接下标
.code
main PROCmov ecx,arr_len ;数组长度mov edx,1 ;临时数值交换区间mov ebx,1 ;间接下标寻址,ebx=isub ecx,1 ;外层循环次数again1:mov ebx,amov eax,arr[ebx*4]  ;eax=tempjd:cmp ebx,0jb L1mov edx,ebxsub edx,1mov ESI,arr[edx*4]cmp ESI,eaxjbe L1mov arr[ebx*4],ESIsub ebx,1jmp jdL1:mov arr[ebx*4],eaxadd a,1loop again1mov ebx,0again2:cmp ebx,arr_lenjae finalmov eax,arr[ebx*4]call WriteIntadd ebx,1jmp again2final:exit
main ENDP
END main

代码分析

这里通过ecx和loop控制外层循坏次数为len-1次以实现源代码中的for循环,从数组第二位开始插向前面的有序数列,这里对while中的判定条件进行取反,当不满足条件时跳出while循环,并将temp的值即为eax赋值给此时数组i下标的位置,while循环满足时依次将数组的元素后移腾出插入元素的位置,排序完成后call writenint循环将数组的元素打印出来即为有序数列

效果展示

相关文章:

汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

目录 前提知识 案例 c的插入排序 32位汇编代码 代码分析 效果展示 前提知识 常用指令add指令 sub指令 mul乘法指令 div除法指令 inc&#xff08;自增&#xff09;&#xff08;即&#xff09; dec&#xff08;自减&#xff09;&#xff08;即--&#xff09; cmp&#xf…...

C++多线程--线程安全的单例模式

0 引言 由于最近事情比较多,所以很久没有更新相应的专栏了。目前事情基本告一段落,重新恢复相应专栏的更新。 本文主要讲解在C++并发编程中如何实现线程安全的单例模式。本文主要由如下几部分构成 臭名昭著的double-check单例实现四种线程安全的单例模式单例模式使用中所带…...

(Android-RTC-9)PeerConnectionFactory

开篇前瞎扯。很久没发技术文章了&#xff0c;此文一直放着草稿箱没有完成&#xff0c;感觉自己在家庭和工作中找到了拖延的借口&#xff0c;开始慢慢变得懒惰了&#xff0c;那是万万不行的。恰逢2023开年ChatGPT的爆火&#xff0c;更让我这些普通程序员危机感瞬间飙升&#xff…...

Vector - CAPL - 定时器函数和使用

定时器在C语言中的使用我想学习过C编程的都不会陌生&#xff0c;它能够提供延时&#xff0c;完成等待一定的时间&#xff1b;它也可以实现多线程的操作&#xff0c;并行实行某些软件功能。那在CAPL中&#xff0c;定时器又能做哪些工作呢&#xff1f;又是怎么使用的呢&#xff1…...

【嵌入式C】常见问题

1、goto的使用场景有哪些&#xff1f;并讨论其局限&#xff1f; &#xff08;1&#xff09;常用来跳出死循坏&#xff1b; &#xff08;2&#xff09;在linux开发中&#xff0c;常用于打印错误&#xff1b; &#xff08;3&#xff09;goto在某些使用场合会破坏程序的栈逻辑&…...

[神经网络]Transfomer架构

一、概述 Transfomer架构与传统CNN和RNN最大的区别在于其仅依赖自注意力机制&#xff0c;而没有卷积/循环操作。其相较于RNN&#xff0c;不需要进行时序运算&#xff0c;可以更好的进行并行&#xff1b;相较于CNN&#xff0c;其一次可以关注全图而不局限于感受野尺寸。 二、模…...

C++之多态 虚函数表

多态 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为。 需要区分一下&#xff1a;1、菱形虚拟继承&#xff0c;是在继承方式前面加上virtual&#xff1b; class Person {}; class Student : virtual public Person {}; class Teacher…...

AI_Papers周刊:第四期

2023.02.28—2023.03.05 Top Papers Subjects: cs.CL 1.Language Is Not All You Need: Aligning Perception with Language Models 标题&#xff1a;KOSMOS-1&#xff1a;语言不是你所需要的全部&#xff1a;将感知与语言模型相结合 作者&#xff1a;Shaohan Huang, Li …...

A Simple Framework for Contrastive Learning of Visual Representations阅读笔记

论文地址&#xff1a;https://arxiv.org/pdf/2002.05709.pdf 目前流行的无监督学范式。通过训练&#xff0c;使模型拥有比较的能力。即&#xff0c;模型能够区别两个数据&#xff08;instance&#xff09;是否是相同的。这在 深度聚类 领域受到广泛的关注。&#xff08;在有监…...

mac安装开发工具:clipy、iterm2、go、brew、mysql、redis、wget等

wget brew install wget clipy Releases Clipy/Clipy GitHub 环境变量 ~下有三个文件 .zshrc .zprofile .bash_profile > cat .zshrc export PATH$PATH:/usr/local/mysql/bin> cat .zprofile eval "$(/opt/homebrew/bin/brew shellenv)"> cat .bas…...

DJ1-1 计算机网络和因特网

目录 一、计算机网络 二、Interent 1. Internet 的介绍 2. Internet 的具体构成 3. Internet 提供的服务 4. Internet 的通信控制 一、计算机网络 定义&#xff1a;是指两台以上具有独立操作系统的计算机通过某些介质连接成的相互共享软硬件资源的集合体。 计算机网络向…...

[1.3.3]计算机系统概述——系统调用

文章目录第一章 计算机系统概述系统调用&#xff08;一&#xff09;什么是系统调用&#xff0c;有何作用&#xff08;二&#xff09;系统调用与库函数的区别&#xff08;三&#xff09;小例子&#xff1a;为什么系统调用是必须的&#xff08;四&#xff09;什么功能要用到系统调…...

【Java开发】JUC进阶 03:读写锁、阻塞队列、同步队列

1 读写锁&#xff08;ReadWriteLock&#xff09;&#x1f4cc; 要点实现类&#xff1a;ReentrantReadWirteLock通过读写锁实现更细粒度的控制&#xff0c;当然通过Synchronized和Lock锁也能达到目的&#xff0c;不过他们会在写入和读取操作都给加锁&#xff0c;影响性能&#x…...

Fragment中获取Activity的一点点建议

平时的Android开发中&#xff0c;我们经常要在Fragment中去获取当前的Activity实例&#xff0c;刚开始的时候可能使用使用Fragment提供的getActivity方法来获取&#xff0c;但是这个方法可能返回null&#xff0c;为了让程序可以正常运行&#xff0c;项目中就出现大量下面这样的…...

Java Math类

Java Math 类是 Java 标准库中提供的一个数学计算类&#xff0c;它提供了很多数学函数&#xff0c;如三角函数、指数函数、对数函数等。在实际工作中&#xff0c;Java Math 类常常被用于处理数学计算问题&#xff0c;例如计算复杂的数学公式、实现数学算法等。本文将详细介绍 J…...

Javascript -- 加载时间线 正则表达式

js加载时间线 1、创建Document对象&#xff0c;开始解析web页面&#xff0c;解析html元素和他们的文本内容后添加Element对象和Text节点到文档中。这个阶段的document.readyState ‘loading’ 2、遇到link外部css&#xff0c;创建线程加载&#xff0c;并继续解析文档 3、遇到…...

gdb/git的基本使用

热爱编程的你&#xff0c;一定经常徘徊在写bug和改bug之间&#xff0c;调试器也一定是你随影而行的伙伴&#xff0c;离开了它你应该会寝食难安吧&#xff01; 目录 gdb的使用 断点操作 运行调试 观察数据 Git的使用 仓库的创建和拉取 .gitignore “三板斧” 常用指令 gd…...

信息安全与数学基础-笔记-④二次同余方程

知识目录二次同余方程的解欧拉判别式Legendre (勒让德符号)二次同余方程的解 什么是二次同余方程的解 注意这里二次同余方程和一次同余方程是不一样的 在x2x^2x2 三 a (mod m) 方程中举例 ↓ 解即剩余类&#xff0c;因为是模m&#xff0c;所以我们在 [ 0, m-1 ]中逐个代入看是…...

Luogu P4447 [AHOI2018初中组]分组

题目链接&#xff1a;传送门 将nnn个可重复的整数分为mmm组&#xff0c;每组中的数必须连续且不重复&#xff0c;使人数最少的组人数最多。 两个最值肯定第一想到二分&#xff0c;每次二分出一个值&#xff0c;判断在这个值为答案的前提下能否完成分组。 在思考判别函数时发现…...

手把手创建flask项目

Flask 框架流程 什么是Flask&#xff1a; Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架 Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy). Flask的核心在于Werkz…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...