汇编语言(Assemble Language)学习笔记(更新中)

零.学习介绍和使用工具

【1】我们使用的教材是机械工业出版社的《32位汇编语言程序设计第二版》。
指导老师是福州大学的倪一涛老师。
这门课程教授的是Intel 80*86系列处理器的32位汇编。我们现在的处理器都兼容这个处理器。

这篇博客只是大二下汇编语言学习的总结,用于基础入门。

【2】环境和工具:

电脑系统:Windows11
VC6和Devc++:用于看c语言对应的汇编,便于研究(也可以直接使用里面的g++)
汇编器:masm6.15--编译汇编,将汇编程序执行
调试器:ollydbg

工具的使用这里省略。

【3】汇编指令的执行过程:

一.从机器语言到汇编语言

程序设计语言是人与计算机沟通的语言,程序员利用它进行软件开发。通常人们习惯使用类似自然语言的高级程序设计语言,如C,C++,Basic,Java等。
高级语言需要翻译为计算机能够识别的指令(机器语言),才能被计算机执行。机器语言是一串0和1组成的二进制代码,如果直接用它来编写程序太过于晦涩难懂且开发效率极低,称为低级语言。
于是我们将二进制底阿妈的指令和数据用便于记忆的符号(助记符,Mnemonic)表示就形成汇编语言(Assembly),所以汇编语言是一种面向机器的低级程序设计语言,也称为低层语言。

二.寄存器与存储

【1】存储有分为外存储器和内存储器。外存储器就是磁盘。而内存储器就是寄存器,内存(分为主存和缓存)。这里重点介绍一下寄存器。

【2】寄存器分类

【3】通用寄存器(重点)

32为兼容16位和8位。所以我们寄存器写EAX或AX都可以。EAX和AX可以分为AH和AL也就是高低两个寄存器。其他也是这样。

地址指针寄存器尽量不要用,很容易导致程序出错。

数据寄存器的习惯用法:

【4】段寄存器和专用寄存器(一般在系统内核用到,我们用不到,了解即可)

三.汇编指令

0.概述

汇编语言由以下3类组成:
1.汇编指令(机器码的助记符)
2.伪指令(由编译器执行)
3.其它符号(由编译器识别)

汇编语言的核心是汇编指令,它决定了汇编语言的特性。
具体语法:

1.注释

汇编语言分号后面是注释。

2.基本框架

例:

include irvine32.inc    ; 包含 Irvine32 库,提供 32 位输入输出功能
.data                   ; 定义数据段,这里定义的数据是存储在内存中
...                     ; 数据定义,这里省略
.code                   ; 定义代码段
main proc               ; 主过程开始...                ; 执行过程,这里省略exit               ; 调用 Irvine32 库中的 exit 函数,程序退出
main endp               ; 主过程结束
end  main               ; 程序结束

3.数据的定义

在汇编语言中,不同的数据类型用来表示不同长度的数据。常见的数据类型,如:
BYTE:一个字节(8位)
WORD:一个字(16位)
DWORD:双字(32位)【也可以是dd】
QWORD:四字(64位)

.data
a dword 1

如果数值不确定,可以用?代替值

.data
a dword ?

4.通用数据处理指令

【1】传送指令mov

传送指令MOV把一个字节,字或双字的操作数从源位置传送至目的位置,可以实现常数,通用寄存器,主存(内存)之间的数据的传送。

例:

但是mov的两个参数不能都是常数或内存。

【2】堆栈操作指令push和pop

【3】与算数相关的指令--add,sub,mul等

基本格式也是add 目的操作数 源操作数。上面指令的两个参数也一样不能都是常数或内存。

【4】某个值+1

例:inc eax 

5.函数初步--函数的使用

【1】汇编中也有函数,将一系列操作进行封装。

函数调用指令:Call f

【2】比如输入输出整数的函数:

(1)输入输出整数--ReadInt和WriteInt
格式:

注:这里我们使用函数之前,要将输出的目标整数先存入eax中。另外这里我们输入输出使用的函数是Irvine32 库,它提供 32 位输入输出功能。

(2)输出字符--WriteString,输出edx中存储内存地址指向的变量

案例:打印hello world

include irvine32.inc  ; 包含 Irvine32 库.datahello_msg byte "Hello World!", 0  ; 存储要显示的字符串
.code
main procmov edx,offset hello_msg   ; 将要显示的字符串地址存储在 edx 中call WriteString           ; 调用 Irvine32 函数 WriteString 输出字符串exit                       ; 退出程序
main endpend main

注:.data 部分用于声明和初始化数据段(存储在内存中的变量)。

在这里,hello_msg db "Hello World!", 0 这行代码的含义是:

(1)hello_msg:变量名称。
(2)byte:byte是一个伪指令,表示内存开辟一个字节的空间存储变量。
(3)"Hello World!":这是要存储的字符串数据,即 "Hello World!"。
(4)0:这里的 , 0 表示以 0 结尾,用于表示字符串的结束。在汇编语言中,定义字符串要在后面自己加上0当作终止符。

(5)offset:offset是来获取内存地址的。因为writeString需要的是变量地址,而不是变量,所以这里字符串不能直接mov edx, hello_msg。而应该使用offset关键字来获取变量的地址放入edx中,这里存的是地址而不是值。
当然mov edx, hello_msg也不会成功,因为字符串“hello world”是byte类型,只有8位,所以mov要用movzx。【还有一个movsx是带符号位的】

这行代码的作用是定义了一个以 "Hello World!" 结尾的字符串并将其存储在内存中,然后将其地址放在edx中,然后调用WriteString函数去内存中找到地址对应的字符串将其输出。

(3)输出换行

call Crlf       ;输出换行

6.定义数组

【1】定义数组

.data
a dd 1,2,3,4,5,6,7

如果要数组一次性赋值:

.data
a dd 10 dup(0)

【2】访问数组

访问第一个元素

include irvine32.inc
.dataa dword 1, 2, 3, 4, 5, 6, 7
.code
start:mov eax, acall writeintexit
end start

注:writeint的本质是读取eax的四个字节,然后将这四个字节的数据转化为int值。
mov eax, a是将第一个元素的值放入eax中。

数组第i个元素访问:

include irvine32.inc
.dataa dword 1, 2, 3, 4, 5, 6, 7
.code
start:mov eax, a+i*4call writeintexit
end start

还有一种a+i*4更加好看更接近c++的写法就是a[i*4],一般我们都这样写。
注:[]这个加不加知识规范的问题,a+i*4和[a+i*4]实际上和a[i*4]是一致的。

include irvine32.inc
.dataa dword 1, 2, 3, 4, 5, 6, 7
.code
start:mov eax, a[i*4]call writeintexit
end start

7.分支和循环结构的汇编实现

【0】基础--比较和跳转指令

一般使用比较和跳转实现分支结构

比较指令: cmp x,y
跳转指令: jmp, jXXX(ja, jb, jz)

cmp x, y:执行操作 x-y (x与y的值不变),根据操作结果改变EFLAG相应的位。
jmp是无条件跳转,而jXXX是有条件跳转。

比如

ja loc: 若x与y是无符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行。
jz/je loc: 若x与y是无符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行
jb loc: 若x与y是无符号数(程序员定义)且x<y,则程序跳转到地址loc处执行
jg loc: 若x与y是有符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行
jz/je loc: 若x与y是符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行
jl loc: 若x与y是无符号数(程序员定义)且 x<y,则程序跳转到地址loc处执行

jge loc 有符号数x>=y

jle loc 有符号树x<=y

【1】分支结构汇编实现--实际是比较和跳转

分支结构案例:求整数 a与b最大值,并在屏幕中输出最大值

算法设计:

if a > b then max=a 
else max=b

分支具体思路:

c++中的写法
if(a<b){Block1
}else{Block2
}转化为比较和跳转指令实现if a<b goto L1Block2goto final
L1:    Block1
final:但是上面并没有Block1和Block2的顺序并没有和我们c++的正常逻辑一一对应
当我们真正去写的时候会发现有点麻烦,一般写的时候会将比较条件反转,也就是像下面这样if a>=b goto L1Block1goto final
L1:    Block2
final:

代码实现题目:

include irvine32.inc  ; 包含 Irvine32 库.dataa DWORD 0x10    ;DWORD,双字32位,0x10是16进制的10b DWORD 0x20.code
main PROCmov eax, acmp eax, bjna maxb jmp final 
maxb: mov eax, b
final : call writeint
exit
main ENDP
END main

【2】循环结构汇编实现--实际是判断

循环结构案例

在内存中存有10个整数,求这10整数 最大值,并在屏幕中输出最大值

算法设计:

循环结构具体思路:

c语言中:
for(i=0;i<n;i++){Block;
}循环的本质是if判断:
if(i<n){Block;i++;
}i=0
L0: if(i<n) goto L1goto final
L1: Blocki++jmp L0
final:将比较条件反转,更简单书写,简化代码
i=0;
L0: if(i>=n)goto finalBlocki++jmp L0
final:

代码实现:

main procmov eax, arr[0];eax存放最大值mov esi, 0; esi存放数组元素下标
L0: cmp esi, 10jge finalcmp eax, arr[esi*4]jge L1mov eax,arr[esi*4];
L1: add esi, 1;jmp L0
final: call writeint
exit
main endp

8.函数详解--自定义函数

1.用于模块化、是重要的封装机制
2.函数定义方式与执行逻辑
3.参数传递方法:
【1】内存变量(数据段)方式--简单说就是在.data下定义全局变量,所有函数都可以用。一般定义全局变量不好。
【2】寄存器方式--简单说就是将数据存放在寄存器中,然后函数要用去寄存器取。
【3】栈方式--将数据放在栈中,pop和push。

一般的话不用第一种,用第二和第三种。考试一般用第二种

案例:插入排序

这里就是采用第二种方式,每次调用函数之前先将参数存入寄存器中,后面函数执行的时候再去寄存器取。和ReadInt等差不多。

include irvine32.inc
.dataarr1 dword 10 dup(?)arr2 dword 20 dup(?)
.code 
main procmov edx,offset arr2mov ecx,20call buildArraymov edx,offset arr2mov ecx,20call outputArray call crlfmov edx,offset arr2mov edi,20call insertSort mov edx,offset arr2mov ecx,20call outputArray
exit
main endpinsertSort procmov ebx,1		
startFor:cmp ebx,edijge endFormov ecx,[edx+4*ebx]  mov esi,ebxsub esi,1 
startWhile:			cmp esi,0jl  endWhilecmp [edx+4*esi],ecxjle endWhile	 mov eax,[edx+4*esi];eax=arr[j]	          mov [edx+4*esi+4],eaxsub esi,1jmp startWhile
endWhile:mov [edx+4*esi+4],ecx		          add ebx,1jmp startFor        
endFor:ret
insertSort endpoutputArray procmov esi,0
startFor:cmp  esi,ecxjge  endFor		mov  eax,[edx+4*esi]call writedecmov  al,' 'call writechar		add  esi,1jmp  startFor
endFor:ret
outputArray endpbuildArray proc	mov esi,0
startFor:cmp esi,ecxjge endFormov eax,1000call randomRangemov [edx+4*esi],eax		add esi,1jmp startFor
endFor:ret
buildArray endpend main

注:ret是函数返回,后面可以接参数。而exit是程序退出。

proc代表函数开始,endp代表函数结束。

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

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

相关文章

数据结构顺序表的操作,窗口界面(c语言版)

// 准备头文件 #include <stdio.h> #include <stdlib.h>#define InitSize 10 // 动态顺序表的初始默认长度// 定义C语言的bool变量 #define bool char #define true 1 #define false 0/* 定义数据元素的数据类型 */ typedef int ElemType; // 方便更改// 动态顺…

css 各种方位计算 - client系列 offset系列 scroll系列 x/y 系列

offset系列 HTMLElement.offsetTop - Web API 接口参考 | MDN 一文读懂offsetHeight/offsetLeft/offsetTop/offsetWidth/offsetParent_heightoffset-CSDN博客 client系列 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop-CSDN博客 scroll系列 秒懂scr…

2024年,如何使用chatgpt4.0为工作赋能?

ChatGPT 4.0的工作原理和功能 ChatGPT 4.0的工作原理和功能可以从以下几个方面进行详细说明&#xff1a; 工作原理 ChatGPT 4.0的工作原理主要基于深度学习技术&#xff0c;特别是Transformer模型的应用。它通过大量的文本数据进行训练&#xff0c;学习语言的模式和规律&…

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。 ​​​​​​​

嵌入式3-15

1、整理思维导图 2、整理课上单向循环链表的代码 3、完成双向链表的剩下四个功能 2、 node_p create_list()//创建链表 { node_p p(node_p)malloc(sizeof(node)); if(pNULL) { printf("申请失败\n"); return NULL; } p->len…

尼伽OLED透明屏闪耀第24届中国零售业博览会,引领零售行业革新

2024 CHINA SHOP 第二十四届中国零售业博览会 3.13-15 上海 3.13-15日&#xff0c;第24届中国零售业博览会盛大开幕&#xff0c;起立科技&#xff08;旗下品牌&#xff1a;起鸿、尼伽&#xff09;携其自主研发的30寸OLED透明屏和移动AI透明屏机器人惊艳亮相&#xff0c;成为展…

【PTA】L1-039 古风排版(C++)

题目链接&#xff1a;L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录&#xff1a; 目录&#xff1a; 题目要求&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 代码&#xff1a; 测试结…

Vulnhub - Jarbas

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…

10分钟用docker搭建【devops】

1.gitlab docker run -d --name gitlab --restartalways --network devops-network -p 8000:80 -p 443:443 -v C:/docker/gitlab/config:/etc/gitlab -v C:/docker/gitlab/logs:/var/log/gitlab -v C:/docker/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest运行完成记得…

智慧工地管理平台APP源码基于物联网、云计算、大数据等技术

目录 ​系统特点 智慧工地云平台功能模块 1、基础数据管理 2、考勤管理 3、安全隐患管理 4、视频监控 5、塔吊监控 6、升降机监控 7、管理分析报表 8、移动端数据推送 9、数据接收管理 智慧工地管理平台系统基于物联网、云计算、大数据等技术&#xff0c;助力工地管理…

wsl ubuntu 安装cuda环境

wsl ubuntu 安装cuda环境: CUDA Toolkit 11.6 Downloads | NVIDIA DeveloperDownload CUDA Toolkit 11.6 for Linux and Windows operating systems.https://developer.nvidia.com/cuda-11-6-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=W…

前端工程化:提升开发效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python Web开发记录 Day11:Django part5 管理员管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、创建管理员表2、管理员列表3、添加管理员①添…

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…

stm32-定时器输出比较PWM

目录 一、输出比较简介 二、PWM简介 三、输出比较模式实现 1.输出比较框图(以通用定时器为例) 2.PWM基本结构 四、固件库实现 1.程序1&#xff1a;PWM呼吸灯 2.程序2&#xff1a;PWM驱动直流电机 3.程序3&#xff1a;控制舵机 一、输出比较简介 死区生成和互补输出一般…

深度学习每周学习总结P1(pytorch手写数字识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 数据导入部分2. 模型构建部分3. 训练前的准备4. 定义训练函数5. 定义测试函数6. 训练过程 0. 总结 总结: 数据导入部分&a…

014 Linux_同步

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;Linux &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多操作系统知识 文章目录 前言一、死锁&#xff08;1&#xff09;死锁概念 二、同步&#xff08;1&#xff09;同步概念&#xff…

计算机考研|双非一战135上岸,408经验分享+复盘

计算机专业的同学真的别想的太天真&#xff01; 相比于其他专业&#xff0c;计算机专业的同学其实还是很有优势的 但是现在随着计算机专业的同学越来越多&#xff0c;找工作的困难程度以及学历自然而然被卷起来了 以前的算法岗基本要求在本科以上&#xff0c;现在基本都是非92研…

家电工厂5G智能制造数字孪生可视化平台,推进家电工业数字化转型

家电5G智能制造工厂数字孪生可视化平台&#xff0c;推进家电工业数字化转型。随着科技的飞速发展&#xff0c;家电行业正迎来一场前所未有的数字化转型。在这场制造业数字化转型中&#xff0c;家电5G智能制造工厂数字孪生可视化平台扮演着至关重要的角色。本文将从数字孪生技术…

提交数据加快百度搜索引擎收录

百度站长工具做了更新&#xff0c;百度收录的地址分享如下&#xff0c;新站点提交后&#xff0c;可以加快百度收录。 普通收录_加快网站内容抓取&#xff0c;快速提交数据工具_站长工具_网站支持_百度搜索资源平台普通收录工具可实时向百度推送数据&#xff0c;创建并提交site…