汇编语言学习

汇编指令

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指令用于实现两个数的加法,比如

add ax,bx

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

3.sub指令

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

4.loop指令

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

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寄存器中。

下面是一个例子。

    mov ax,26
    mov bl,10
    div bl

观察一下寄存器中的值。

6.inc指令

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

7.and和or指令

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

and ax,0000000011111111B
or bl,11111111B

汇编中的数据

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Turtle库画小猫咪

    这个是用python库画的小猫咪,前面一步步的画整个猫的整个身体,具体步骤都写在了注释之中。身体部分画的比较快,后面画了5个心,由于画心的时候要改变好多度数,而...

    KevinBruce
  • [BJDCTF2020]Easy MD5题解

    这里用到了一个关于md5的知识点,可参考实验吧后台注入一题。PHP中md5函数如果第二个参数设为true,返回的是二进制内容,如果能恰好凑出类似'or的字符串,...

    KevinBruce
  • L2-003 月饼 python实现

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多...

    KevinBruce
  • Java工具集-Bean对象(BeanUtils)

    cwl_java
  • Python绘制带有中文标签和图例的图

    本文属于科学计算与可视化范畴,要点在于扩展库numpy、pylab、matplotlib的用法。 import numpy as np import pylab...

    Python小屋屋主
  • Xen的敏感指令陷入-《Xen虚拟化技术》学习

    没有虚拟化基础的童鞋可先阅读Linux阅码场前几天刊发的《KVM最初的2小时——KVM从入门到放弃(修订版) 》入门。

    Linux阅码场
  • Spark如何在一个SparkContext中提交多个任务

    我是攻城师
  • minigui:自定义字体文件的安装位置(install location for custom font)

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • 对数字证书的理解

    最简单的情况下,服务器掌握私钥,任何人都可以使用公钥。因此只要用公钥解密就能确认数据是否来源于服务器。

    gojam
  • 从源码来理解slf4j的绑定,以及logback对配置文件的加载

      项目中的日志系统使用的是slf4j + logback。slf4j作为一个简单日志门面,为各种loging APIs(像java.util.logging,...

扫码关注云+社区

领取腾讯云代金券