手把手教你学习汇编语言——从入门到起飞

手把手教你学习汇编语言——从入门到起飞关于这篇博客 笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试有什么不足的忘大佬评论或私信指出 汇编环境安装汇编运行调试汇编指令希望大家看完这些找一些样例练习一下会学的更好 这里有一些练习题希望能帮助到大家汇编语言编程题总结汇编语言环境安装这里用的是 Masm 相比较纯 Dosbox 会简单很多的汇编语言和 CodeBlock 安装包密码 dqs9 下载以后打开运行下一步安装完成即可安装完成后打开 进来是默认的程序框汇编语言运行的话 一定要保存文件到本地才可以

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




汇编语言环境安装

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

汇编运行调试

在这里插入图片描述

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

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

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

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

汇编指令

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

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中。 
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 ;奇偶位不等则跳转 
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 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176558.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:38
下一篇 2026年3月26日 下午9:38


相关推荐

  • css首行缩进两个字符_网页制作首行缩进2字符

    css首行缩进两个字符_网页制作首行缩进2字符text-indent:2em单位可以用px,em,rem等推荐使用em:em表示两个字符,不会受设备不同影响,兼容性好

    2025年8月3日
    6
  • 使用zlib/gzip压缩和解压缩?(Flash和GALGAME使用的压缩格式)[通俗易懂]

    使用zlib/gzip压缩和解压缩?(Flash和GALGAME使用的压缩格式)[通俗易懂]c#下怎么使用zlib? zlib是开源的压缩格式 源代码和DLL可以去http://www.zlib.net/  bzip2是建立在libbzip2 激活成功教程GALGAME时候很多人发现许多游戏系统都采用这种压缩格式 甚至Flash格式版本6以后,增加了可压缩选项,用的是ZLib压缩(wxd:jrj.com.cn金融界flash数据就是这样,减少传输量) 我今天看过金山词霸2009毫无疑问的使用ZLib和bzip2 那么编写解压缩或者压缩程序显得很重要 对于C++程序员来说,很简单,把DLL导入

    2022年7月16日
    18
  • wifi 中间人攻击_什么是中间人攻击?该如何防止?

    wifi 中间人攻击_什么是中间人攻击?该如何防止?什么是中间人攻击 在中间人攻击中 攻击者将自己放置在两个设备 通常是 Web 浏览器和 Web 服务器 之间 并拦截或修改两者之间的通信 然后 攻击者可以收集信息并模拟这两个特工中的任何一个 除了网站之外 这些攻击还可以针对电子邮件通信 DNS 查找和公共 WiFi 网络 中间人攻击的典型目标包括 SaaS 业务 电子商务业务和金融应用程序用户 您可以将中间人攻击者想象成一个无赖的邮政工作人员 他坐在邮局里 拦截了

    2026年3月16日
    2
  • Windows线程漫谈界面线程和工作者线程

    每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率。针对界面来说,还能提高界面的响应力。线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”

    2021年12月25日
    45
  • Midjourney生成的图会侵权吗 Midjourney生成的图会被别人看到吗

    Midjourney生成的图会侵权吗 Midjourney生成的图会被别人看到吗

    2026年3月15日
    2
  • jieba库的安装教程_利用jieba库进行txt分词

    jieba库的安装教程_利用jieba库进行txt分词jieba库jieba库的安装jieba库的基本介绍jieba库的使用jieba库的安装(cmd命令行)pipinstalljiebajieba库的基本介绍(1)jieba库概述jieba库是优秀的中文分词第三方库。中文文本需要通过分词获得单个的词语;jieba是优秀的中文分词第三方库,需要额外安装;jieba库提供三种分词模式,最简单只需掌握一个函数;(2)jieba…

    2026年2月8日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号