当前位置: 首页 > 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循环将数组的元素打印出来即为有序数列

效果展示

http://www.lryc.cn/news/30965.html

相关文章:

  • C++多线程--线程安全的单例模式
  • (Android-RTC-9)PeerConnectionFactory
  • Vector - CAPL - 定时器函数和使用
  • 【嵌入式C】常见问题
  • [神经网络]Transfomer架构
  • C++之多态 虚函数表
  • AI_Papers周刊:第四期
  • A Simple Framework for Contrastive Learning of Visual Representations阅读笔记
  • mac安装开发工具:clipy、iterm2、go、brew、mysql、redis、wget等
  • DJ1-1 计算机网络和因特网
  • [1.3.3]计算机系统概述——系统调用
  • 【Java开发】JUC进阶 03:读写锁、阻塞队列、同步队列
  • Fragment中获取Activity的一点点建议
  • Java Math类
  • Javascript -- 加载时间线 正则表达式
  • gdb/git的基本使用
  • 信息安全与数学基础-笔记-④二次同余方程
  • Luogu P4447 [AHOI2018初中组]分组
  • 手把手创建flask项目
  • SpringCloud-4_Eureka服务注册与发现
  • 【react全家桶】生命周期
  • 虚拟机安装Windows 10
  • 【CMU15-445数据库】bustub Project #2:B+ Tree(下)
  • leetcode 困难 —— 外星文字典(拓扑排序)
  • ubuntu server 18.04使用tensorflow进行ddqn训练全过程
  • 2023年全国最新二级建造师精选真题及答案14
  • mysql一条语句的写入原理
  • 嵌入式Linux内核代码风格(二)
  • Spring Boot @Aspect 切面编程实现访问请求日志记录
  • 初学者的第一个Linux驱动