手把手教你学习汇编语言——从入门到起飞_汇编学习-程序员宅基地

技术标签: 从入门到入土  手把手教  教学篇  汇编语言  河北专接本总结分享  

专接本交流群:1051749714 (有什么问题欢迎进群讨论)
关于这篇博客,笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试
有什么不足的忘大佬评论或私信指出。

汇编环境安装
汇编运行调试
汇编指令

希望大家看完这些找一些样例练习一下会学的更好,这里有一些练习题希望能帮助到大家
汇编语言编程题总结

汇编语言环境安装

这里用的是Masm,相比较纯Dosbox会简单很多的
汇编语言和CodeBlock安装包 密码:dqs9

下载以后打开运行
下一步
在这里插入图片描述
安装
在这里插入图片描述
完成即可
在这里插入图片描述
安装完成后打开,进来是默认的程序框

在这里插入图片描述
汇编语言运行的话,一定要保存文件到本地才可以运行,调试的话也需要先运行一下才能调试,否则就是调试的上次运行的程序。

汇编运行调试

当我们写好以后,它会提示我们先保存在运行
在这里插入图片描述

ctrl+s保存在一个地方,记得改名字,把 * 换成名字
在这里插入图片描述

再点击运行,出现这个就可以了,这是没有屏幕输出的程序,如果有屏幕输出,还会先输出程序输出的,在输出这一行。
在这里插入图片描述

(如果到时候一闪而过,说明你的程序有问题)
下面会有提示哪一行有问题的,双击就会高亮显示那一行
(笔者这个就是在AL后面多打了一个S)

在这里插入图片描述

运行可以了,那就大概说一下调试的过程(如果要调试的话,一定要先运行一遍才可以,否则就是调试的上一次运行的代码)

调试的话,输入 T 是运行一步,你可以选择一步一步的运行,
我们输入一个T 出来的划线位置就是下一次要运行的代码
我们可以看到命令框第二个划线的 MOV AL,[0000H] 我们的AL赋值是12H 第二次AX的低四位还不是12H
当我们再输入一个T,才是12H,也就是调试出来的代码是下一次将要运行的代码。
在这里插入图片描述

也许有些时候可能会觉得一步一步调试太麻烦了,这里也有直接跳转调试的

我们之间输入一个U就会出现每一步代码所对应的数。
在这里插入图片描述

通过G 在写对应的号,就可以跳转到指定的位置
在这里插入图片描述

其他的话,可能会有更方便的,但是笔者认为这些就很够用了。

软件安装运行调试大概就是到这里了,接下来我们来简述一下基本的命令语句吧

汇编指令

先来看一下基本的结构(分号后面的都是注释的,汇编语言用分号注释)

DATAS SEGMENT	;数据段
    ;此处输入数据段代码  
DATAS ENDS
 
CODES SEGMENT	;代码段
    ASSUME CS:CODES,DS:DATAS		;数据段给DS,代码段给CS
START:			;开始代码
    MOV AX,DATAS	;需要先把DATAAX寄存器,然后再从AXDSDATA不能直接给DS
    MOV DS,AX
    ;此处输入代码段代码
    MOV AH,4CH		;结束语句
    INT 21H
    
CODES ENDS		;代码段结束
    END START	;结束代码

先来说常用的命令符号,如果大家有什么其他命令符使用的话,可以评论或者私信我,我看到会尽快给大家展示出来如何使用

MOV AL,BL
这里就是把BL的值放到AL中。

 

然后就是类似于C语言的函数
这个函数就是起个名字加个分号
汇编语言的函数没有结束的地方,一般如果需要结束的加,就要加一个跳转到其他地方
如果没有跳转,他就会一直运行到下面

DATA SEGMENT 
A DB 12H	;定义两个变量
B DB 24H
DATA ENDS 
CODES SEGMENT 
	ASSUME DS:DATA,CS:CODES
START:
	MOV AX,DATA
	MOV DS,AX
	
	JMP EXIT	;这里就是直接跳转到EXIT  JMP就是跳转的方法
	
	MOV AL,A	;A->AL
	MOV BL,B	;B->BL
	MOV A,BL	;BL->A
	MOV B,AL	;AL->B
	 
	 
EXIT:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


当然还有很多特别的JMP 也就是一些带标志位的 就是标志寄存器里面的六个状态位

1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CFZFSFOF的使用频率较高,而标志位PFAF的使用频率较低。

4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为16、溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,
OF的值被置为1,否则,OF的值被清为0。 
(有些时候,有些问题会问你是不是溢出了,这里有个巧计的方法,负数加负数是正数,正数加正数是负数,如果出现这种情况就是溢出了)

然后衍生出来的就是几个条件跳转指令
一般情况下,条件跳转上面要跟一些影响标志寄存器的命令


JE   ;等于则跳转
JNE  ;不等于则跳转
 
JZ   ;0 则跳转
JNZ  ;不为 0 则跳转
 
JS   ;为负则跳转
JNS  ;不为负则跳转
 
JC   ;进位则跳转
JNC  ;不进位则跳转
 
JO   ;溢出则跳转
JNO  ;不溢出则跳转
 
JA   ;无符号大于则跳转
JNA  ;无符号不大于则跳转
JAE  ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转
 
JG   ;有符号大于则跳转
JNG  ;有符号不大于则跳转
JGE  ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转
 
JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转
JBE  ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转
 
JL   ;有符号小于则跳转
JNL  ;有符号不小于则跳转
JLE  ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转
 
JP   ;奇偶位置位则跳转
JNP  ;奇偶位清除则跳转
JPE  ;奇偶位相等则跳转
JPO  ;奇偶位不等则跳转

说完跳转类的指令,接下来我们看一看左移右移指令
左移这种指令左移一位就是二进制左移一位,也就是乘2的操作。

SHL(Shift Left)SAL(Shift Arithmetic Left): 每位左移, 低位补 0,  高位进 CF
SHR(Shift Right)     : 每位右移, 低位进 CF, 高位补 0
SAR(Shift Arithmetic Right)     : 每位右移, 低位进 CF, 高位不变(也就是高位复制到第二位)

使用的时候就是 
SHL AL,1
左移一位
如果移动的位数大于1位,就要放到CX

循环左移右移

;ROL(Rotate Left): 循环左移, 高位到低位并送 CF
;ROR(Rotate Right): 循环右移, 低位到高位并送 CF
;RCL(Rotate through Carry Left): 循环左移, 进位值(CF)到低位, 高位进 CF
;RCR(Rotate through Carry Right): 循环右移, 进位值(CF)到高位, 低位进 CF

使用的时候就是 
ROL AL,1
循环左移一位
如果移动的位数大于1位,就要放到CX

然后就是加减乘除

加法add和adc、inc
ADD AL,BL
ALBL加起来放到AL

ADC的话就是ADD的运算在家一个CF状态位的值,

INC AL
AL1


减法sub和sbb、dec
SUB 对应ADD
SBB 对应ADC
DEC 对应INC
用法都是一样的,就是一个是加一个是减

乘法mul和imul
MUL是无符号乘法
MUL 8位的   就是AL乘这个数放到AL 高位放到AH
MUL 16位的   就是AX乘这个数放到AX中	高位放到DX

除法div和idiv
DIV是无符号除法
DIV 8位的   就是 AX除这个数,商放AL  余数放AH
DIV16位的   就是(DX:AX)除这个数,商放AX  余数放DX

异或运算XOR

XOR AL,BL
ALBL异或运算放入AL

与运算AND   或运算OR都是一样的

然后就是CMPTEST
CMP 就是对应的减法,但是这个不会影响AL的值,他只会影响状态标志位
TEST 就是AND的用法,也是不会影响AL,只影响状态标志位

最后就是DOS功能的输入输出

字符输入输出
DATA SEGMENT 
	 
DATA ENDS 

CODES SEGMENT 
	ASSUME DS:DATA,CS:CODES
START:
	MOV AX,DATA
	MOV DS,AX
	
	MOV AH,01H	 ;键盘输入的时候,给AH  1
	INT 21H		 ;然后INT 21H调用,默认输入到ALMOV DL,AL	 ;CMD窗口输出的时候,要把输出的放到DLMOV AH,02H	 ;AH  2
	INT 21H
	
	 
	 
EXIT:
   		MOV AH,4CH
        INT 21H
CODES ENDS
    END START
字符串输入输出
DATA SEGMENT 
	 BUF DB 20 DUP('$')
	 BUFF DB 'Hello World!$'
DATA ENDS 

CODES SEGMENT 
	ASSUME DS:DATA,CS:CODES
START:
	MOV AX,DATA
	MOV DS,AX
	
	MOV DX,OFFSET BUF	;把偏移地址给DX,也可以用 LEA DX,BUF  二者皆可
	MOV AH,0AH	 ;键盘输入的时候,给AH  10
	INT 21H		 ;然后INT 21H调用,默认输入到BUFMOV DX,OFFSET BUFF	 ;CMD窗口输出的时候,要把输出偏移地址放到DXMOV AH,09H	 ;AH  2
	INT 21H
	
	 
	 
EXIT:
   		MOV AH,4CH
        INT 21H
CODES ENDS
    END START
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46285416/article/details/116637114

智能推荐

【解决】python连接mysql数据库过段时间就会断开pymysql.err.OperationalError_pymysql连接数据库一段时间失效-程序员宅基地

文章浏览阅读1.2w次,点赞11次,收藏23次。问题:1.python中的数据库连接没有长连接的概念,之前我就踩过这个坑:用最基础的连接方法连接mysql数据库,然后往数据库插入数据,过一会儿就报错了(错误的代码我忘了,后面有遇到场景再重现一下),大概的意思是数据库连接已断开。2.python基础连接方式进行数据库连接及增删改查操作,每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。解决办法:问题1中如果不在意数据库性能的话最简单的就是简单预处理一下:try: _pymysql连接数据库一段时间失效

什么是CPLD-程序员宅基地

文章浏览阅读1.5k次。什么是CPLDCPLD(Complex Programmable Logic Device)是Complex PLD的简称,一种较PLD为复杂的逻辑元件。CPLD是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。发展历史及应_cpld

经济型EtherCAT运动控制器(一):功能简介与应用场景_运动控制器可以用在哪些领域-程序员宅基地

文章浏览阅读3.7k次。正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位等等。_运动控制器可以用在哪些领域

Java开发中常用的三种加密方式_java企业项目 用户密码用非对称加密还是散列函数加密-程序员宅基地

文章浏览阅读1.5k次。Java开发中常用的三种加密方式前言: 常用术语解释: 非对称加密:加密和解密所使用的的密钥不一致,通过非对称算法实现。 对称加密: 加密和解密所使用的密码是一致,使用的是对称算法。 PUBLIC KEY:公钥。 PRIVATE KEY: 私钥。 信息摘要:通过一个算法使固定数数据产生一个特定的信息摘要。1.非对称加密。 典型的如RSA,AES等,..._java企业项目 用户密码用非对称加密还是散列函数加密

springboot整合websocket高级版_simpsessionattributes-程序员宅基地

文章浏览阅读703次。文章目录sockjs介绍产生的原因环境搭建springboot整合sockjs使用场景聊天室开发点对点通信群聊效果总结加入战队微信公众号上一章节我们说了websocket的优缺点,我们通过websocket和http的对比分析,总结出用websocket的场景。今天小编带大家通过一个案例使用下升级版的websocket。sockjs介绍So长江J算是一个浏览器库,它提供了一个跨浏览器的api..._simpsessionattributes

4.相机标定——张氏标定原理(无畸变)_无畸变的相机需要内参标定吗-程序员宅基地

文章浏览阅读804次,点赞2次,收藏4次。4.相机标定——张氏标定原理(无畸变)1.相机标定:坐标系转换学习2.相机的畸变介绍3.相机标定原理(不考虑径向畸变)A Flexible New Technique for Camera Calibration 张氏标定论文原文在第一篇博客中已经对坐标系转换做了详细介绍。在张氏标定原理中便不再介绍,直接使用其结论。请配合论文原文进行食用。4.1坐标系转换回顾[Pxi∗ZcPyi∗ZcZc]=[M∗f−M∗f∗cotθM∗Px0N∗f/sinθN∗Py001]∗(R∣−RC)∗[xwywzw_无畸变的相机需要内参标定吗

随便推点

Mac使用homebrew下载的nginx修改了配置文件,无法在浏览器内访问或修改配置文件端口等不生效_mac 配置了 nginx 没有生效-程序员宅基地

文章浏览阅读1.6k次。使用homeBrew下载了nginx,修改端口号却无法访问1. 安装(可以用 brew 安装)sudo brew install nginx2. 查看 nginx 版本nginx -v3. 启动 nginxsudo nginx也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:sudo brew services start nginx4. 查看 nginx 是否启动成功在浏览器中访问 ,如果出现如下界面,则说明启动成功.5. 关闭._mac 配置了 nginx 没有生效

QTimer,QTime的一点应用 _qtimer 未释放-程序员宅基地

文章浏览阅读3.5k次。<!-- document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() {

Java 读取 properties 配置文件的几种方式及注意点_config.properties (no such file or directory)-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏5次。1、引言java开发中,经常需要读取配置文件,有时即使我们方法是对的,但是就是读取不到需要的内容,会报下面的错:java.io.FileNotFoundException: sr/configure/config.properties (No such file or directory) at java.io.FileInputStream.open0(Native Method) at..._config.properties (no such file or directory)

存储(二):OSS2模拟低配百度网盘存储(优化存储)-程序员宅基地

文章浏览阅读5.3k次。在存储(一)中,已经可以把图片存储到阿里云产品的oss存储服务器上边了。问题:如果真是像存储(一)中所实现的功能:用户来一个图片、文件、视频或者其他的待存储对象,我就要给他存储到oss服务上边,这样存储空间的占用速度非常快,在大数据的时代下根本就无法满足需求,如果采用扩容,你无论阔多大,以这样的用户存储速度都不够用,而且存储服务器的高额存储费用可不是开玩笑的。分析:如果我们认真观察网上的数据,其实很大一部分数据都是重复的,比如QQ空间微信朋友圈等等,有没有发现好友有时候发的图片可能是之前用过的,即重

LINUX/MAC的rpath,搜索依赖库时从哪里开始_mac rpath-程序员宅基地

文章浏览阅读1k次。  最近一段时间,因为加载调用各种本地库,在LINUX/MAC上专门研究了rpath问题。最初是想使用全路径方式,这样也能正确执行,有两个缺点:路径太长,不好维护。 安装路径如果变化,就错了。  改进办法是什么?就是使用相对路径,这样搜索加载时基于安装目录下的相对路径,就避免了上述问题。那么相对路径是相对于谁?开始以为,位于同一个目录下的库文件,rpath使用.(当前目录)。结果报错说找不到。后来经过实验,结论是:  rpath搜索相对路径时,是从当前执行文件开始。  举例来说:安装目录是A_mac rpath

Allegro PCB焊盘以及封装制作_allegro焊盘-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏23次。记录硬件工程师的EDA工具学习之路……以Allegro为主……_allegro焊盘

推荐文章

热门文章

相关标签