Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >汇编语言学习

汇编语言学习

作者头像
KevinBruce
发布于 2020-03-11 07:15:08
发布于 2020-03-11 07:15:08
95300
代码可运行
举报
文章被收录于专栏:CTF及算法学习CTF及算法学习
运行总次数:0
代码可运行
汇编指令

1.mov指令

mov是一个传送指令,可以实现以下操作:

  • 将数据传给寄存器,比如:mov al,10H
  • 将寄存器中的值传给寄存器,比如mov ax,bx
  • 将内存单元中的值传给寄存器,比如mov ax,[10]
  • 将寄存器中的值传给内存单元,比如mov ds:[0],ax

有一点需要注意,数据不能直接传给段寄存器,比如mov ds,100H就是错误的。但是可以将其他寄存器中的值赋给段寄存器。段寄存器有cs,ds,ss,es等。如果你想知道为什么,那就可以去了解一下关于每条指令的硬件实现。后面还有好多指令有一系列的限制,其限制都是与硬件实现有关的。

补充一点需要注意的,当执行与内存单元相关的数据传送时,中括号中的寄存器只能是四选一,这四个寄存器包括:bx,bp,si,di。四个寄存器在进行间接寻址时不能拆成8位的用(bp,si,di本来也只能支持16位,本身不能拆开)。举个例子mov ax,[bx+100]是正确的,mov ax,[bl+1]是错误的。

此外,有的软件不支持中括号中是数字,并且把括号中的数字当做内容来使用。针对这种情况,比较保险的方法是在中括号前面加上段前缀,比如mov ds:[0]。

2.add指令 add指令用于实现两个数的加法,比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add ax,bx

该指令会将bx中的值加到ax上,并且结果会保存在ax中。需要注意的是,该指令不支持对段寄存器进行操作,无论段寄存器是作为第一个操作数还是第二个操作数。

3.sub指令

sub是一个减法指令,与add可以看成一对,除了执行的是减法命令之外,其他的与add完全相同。比如在寄存器方面,sub也不支持对段寄存器进行操作。

4.loop指令

loop在汇编中用作循环,会执行标号到loop之间的部分,循环结束条件是cx寄存器的值为0。下面是一个例子,令ax寄存器中的值累加6次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
assume cs:code

code segment
    mov ax,0
    mov cx,6
s:  inc ax
    loop s
    mov ax,4c00h
    int 21h
code ends

end

约定一下,(xxx)代表xxx寄存器中的值。

循环部分的执行流程为,遇到loop指令的时候,(cx)先减1,如果(cx)==0,则循环结束,执行下一条语句,否则调到标号对应的位置。这里有一个容易迷惑人的地方,就是如果先判断(cx)-1的值,那循环只执行了5次,那如何做到的使(ax)为6呢。原因很简单,在第一次遇到标号s对应的汇编指令时,该指令会执行一次,无视标号。(标号并不是指令,只是起到指示地址的作用,编译后会被转化为实际的地址。)只有在遇到loop指令时,才会进行判断,然后选择是否跳转到标号的位置执行相应的命令。

运行一下程序,执行debug程序,观察程序运行的每一步。

inc第一次执行,cx寄存器并不受影响

执行到loop的时候,cx寄存器发生了变化。而且可以看到,在被编译后,s已经没有了,变成了其实际的IP寄存器的位置0006。

后面就不全展示了。

5.div指令

该指令用于除法运算,除数存放在一个8位寄存器中,被除数在存放在ax中。得到的商在al寄存器中,余数在ah寄存器中。

下面是一个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    mov ax,26
    mov bl,10
    div bl

观察一下寄存器中的值。

6.inc指令

在之前说到loop指令的时候已经演示过用法了,该指令的作用是使寄存器中的值自增1。(需要注意该命令同样不能用于段寄存器)

7.and和or指令

and指令和or指令分别用来将两个数据进行和、或的运算。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
and ax,0000000011111111B
or bl,11111111B
汇编中的数据

汇编语言支持数字型数据和字符型数据。

数字型数据支持3种数制,包括10进制,16进制和2进制,可以靠后缀来区分。10进制没有后缀,16进制后缀为H,2进制后缀为B,后缀不区分大小写。

字符型数据则是直接写上字符加单引号即可,比如mov al,'d'。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
汇编语言_汇编语言程序
开头和结尾的两句代表伪指令 只有编译器可以读懂 汇编指令可以被翻译为机器码最终被cpu执行 汇编程序 就是包含汇编指令和伪指令的文本 mov ax,4c00h int 21h 跟C语言程序的return 0一样 返回控制权 一个汇编程序是由多个段组成的 这些段被用作各种空间来使用 一个有意义的汇编程序至少需要一个段 且每个段都需要段名 段名 segment--段的开始 段名 ends--段的结束 assume假设 含义是假设某一段寄存器和程序中我们定义的段名关联起来 可以理解为和变量的引用一个意思
用户7272142
2023/11/14
2510
汇编语言_汇编语言程序
【汇编语言】[BX]和loop指令(一)—— 初识[BX]和loop指令
和[0]有些类似,[0]表示内存单元,它的偏移地址是0。比如在下面的指令中(但是注意这个是在 Debug 中使用的方式):
Crossoads
2024/11/13
5990
【汇编语言】[BX]和loop指令(一)—— 初识[BX]和loop指令
(五)汇编语言——[bx]和loop指令
目录 [...]与(...) [...] (...) idata Loop指令 段前缀 总结 ---- [...]与(...) [...]         这个我们其实见过,代表的是一个内存单元,段地址在DS中,偏移地址就是[bx]。 (...)         这个是表示一个内存单元或寄存器中的内容,但是千万要注意,这个是人为规定的,不是汇编语法,上面那个是汇编语法。         比如:movax,[2],这个指令,用()来表示就是:(ax)=((ds)*16+2)。 idata
小点点
2022/12/28
6240
(五)汇编语言——[bx]和loop指令
汇编语言设计程序篇-03
如果不明确指定,那么[0]就表示ds:[0],如果明确指定了,像上面es:[bx],那对应的段地址就默认按照es寄存器中的值为准
大忽悠爱学习
2022/06/19
6530
汇编语言设计程序篇-03
【汇编语言】直接定址表(一)—— 「从单元标号到跨段数据:解锁汇编语言的隐藏技巧」
比如:下面的程序将code 段中的a标号处的8个数据累加,结果存储到b标号处的字中。
Crossoads
2025/01/20
1540
汇编语言第三版答案(王爽)
汇编语言答案(王爽)  此文只是用来存个档,不喜勿喷 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte。 (4)1GB是 1073741824 (2^30) 个Byte、1MB是 1048576(2^20) 个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80
Angel_Kitty
2018/04/17
2.5K0
汇编语言全梳理(精简版)
内存地址由 段地址:偏移地址 决定,8086 选择 ds 段寄存器作为默认的段地址
全栈程序员站长
2021/04/07
1.8K0
汇编语言从入门到精通-5微机CPU的指令系统1
5.1 汇编语言指令格式   为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的,这就象在学习高级语言程序设计时,要清楚高级语言语句的语义、语法及其相关规定一样。
墨文
2020/02/28
1.1K0
汇编语言从入门到精通-5微机CPU的指令系统1
(十)汇编语言——CALL和RET指令
而如果转移地址在寄存器里面的话,就有一点不一样了,但是和我们之前介绍的 jmp 指令类似的,我们具体看看吧!就相当于下面的语句。
小点点
2023/02/01
1.4K0
【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问
(2)被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。 (3)结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。
Crossoads
2024/11/21
1730
【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问
汇编基础
​ cup与所有内存之间:地址总线,数据总线,控制总线,每条线对应不同信息,指令与数据分开
Dean0731
2020/08/17
1.5K0
汇编语言访问寄存器和内存篇---02
注意: 并不是一个物理地址就可以决定一个段地址,而是当我们给出一个段地址后,通过适当调整,即加上一个偏移地址,就可以得到一个物理地址,看下面的例子:
大忽悠爱学习
2022/06/19
9240
汇编语言访问寄存器和内存篇---02
【汇编】(六)[BX] 和 Loop 指令
我们要完整地描述一个内存单元,需要两种信息: (1)内存单元的地址; (2)内存单元的长度(类型);
sidiot
2023/08/31
2860
【汇编】(六)[BX] 和 Loop 指令
汇编语言_访问寄存器和内存
运算器进行信息处理 寄存器进行数据的存储 控制器协调各种器件进行工作 寄存器是CPU内存信息存储单元
用户7272142
2023/11/10
2780
汇编语言_访问寄存器和内存
《汇编语言》——笔记(一)
在讲汇编语言之前,先介绍下机器语言。机器语言是机器指令的集合。电子计算机的机器指令是一列二进制数字,计算机将转变高低电平,来驱动电子器件。
天钧
2019/07/25
1.2K0
《汇编语言》——笔记(一)
【汇编语言】[BX]和loop指令(三)—— Debug与masm的指令处理差异与loop,[bx]的联合应用
但是在汇编源程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理。
Crossoads
2024/11/13
1030
【汇编语言】[BX]和loop指令(三)—— Debug与masm的指令处理差异与loop,[bx]的联合应用
8086汇编语言之Loop
Loop指令和cx寄存器配合使用, 用于循环操作,类似于高级语言中的do while循环
乱码三千
2021/08/24
1.6K0
汇编语言期末复习不挂科——知识点总结
数据的表示和类型 二进制:二进制的表示元素是0和1,书写时,在数据后面紧跟一个字母B,如:0101B 八进制:八进制的表示元素是:0-7,书写时,在数据后面紧跟字母Q,如1234Q 十六进制:基本元素是0-9,A-F,其中A-F依次代表10-15 ▮书写时,数据后面紧跟字母H,当十六进制的第一个字符是字母时,在其前面必须添加一个“0” 寄存器 16位寄存器:
全栈程序员站长
2022/07/31
9780
汇编语言期末复习不挂科——知识点总结
【汇编语言】[BX]和loop指令(二)——在Debug中跟踪用loop指令实现的循环程序
ffff:0006 单元中的数是一个字节型的数据,范围在0-255之间,则用它和3相乘结果不会大于65535,可以在dx中存放下。
Crossoads
2024/11/13
1210
【汇编语言】[BX]和loop指令(二)——在Debug中跟踪用loop指令实现的循环程序
汇编语言学习
   7、1Byte = 8bit ;    1KB = 1024B ;  1MB = 1024KB ;   1GB = 1024MB
tandaxia
2018/09/27
1.6K0
汇编语言学习
推荐阅读
相关推荐
汇编语言_汇编语言程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档