汇编语言全梳理(精简版)

汇编语言全梳理(精简版)

寄存器一览

  • 通用寄存器
    • ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl)
    • sp,bp,si,di
  • 指令寄存器
    • ip
  • 标志寄存器
    • FR
  • 段寄存器
    • cs,ds,ss,es

 

mov

指令 示例
mov 寄存器, 数据 mov ax, 8
mov 寄存器, 寄存器 mov ax, bx
mov 寄存器, 内存

mov ax, [0]

mov ax, [bx]

mov 内存, 寄存器

mov [0], ax

mov [bx], ax

内存地址由 段地址:偏移地址 决定,8086 选择 ds 段寄存器作为默认的段地址

由于段寄存器也是寄存器,除了硬件规定不能直接将数据 mov 到段寄存器之外,其他的和正常寄存器一样

指令 示例
mov 段寄存器, 寄存器 mov ds, ax
mov 寄存器, 段寄存器
mov ax, ds
mov 段寄存器, 内存 mov ds, [0]
mov 内存, 段寄存器 mov [0], ds

变种

  • mov ax, ‘a’:处理字符
  • mov ax, [bx + 1]:可用作数组操作
  • mov ax, [bx + si]
  • mov ax, [bx + si + 1]
  • mov word ptr [0],1:指定长度为一个字
  • mov byte ptr ds:[0], 1:指定长度为一个字节

 

add / sub

 格式同 mov 一样 

 

mul

计算:其中一个乘数放在 al 或 ax 中,另一个看指令

  • mul reg
  • mul 内存单元

结果:8位相乘结果放在 ax 中,16位相乘结果放在(高位dx 地位ax)中

 

div

  • div 寄存器
  • div 内存单元

除数为 8 位

  ax dx
  ah al  
计算时 被除数全部 16 位  
结果 余数  

 

除数为 16 位

  ax dx
计算时 被除数低 16 位 被除数高 16 位
结果 余数 

 

寻址方式总结

<span>汇编语言全梳理(精简版)</span>

 

push / pop

CPU 取 SS:SP 作为栈顶地址,我们可以自己初始化栈顶地址为 10010H

mov ax, 1000H
mov ss, ax
mov sp, 0010H
指令 步骤
push ax

SP = SP – 2

ax 内容送入栈顶的内存地址

pop ax

栈顶的内存地址的内容送入 ax

SP = SP + 2

push/pop 段寄存器

同理

push/pop 内存单元

同理

另外:pushfpopf 表示将标志寄存器的值压栈和出栈 

 

loop

mov ax, 2
mov cx, 11
s: add ax, ax
loop s

loop s 表示:

  1. cx = cx – 1
  2. 如果 cx 为 0 则继续执行下面的指令
  3. 如果 cx 不为 0 则跳转到标号 s 处

 

定义不同的段,标准示例

assume cs:code, ds:data, ss:stack

data segment
    dw 0001h, 0002h, ... 000fh
data ends

stack segment
    dw 0,0,0,0 ... 0
stack ends

code segment
    ;定义数据段
    mov ax, data mov ds, ax
    ;定义栈段
    mov ax, stack mov ss, ax
    mov sp, 20h
    ...
code ends

end

 

and / or

  • and al, 10110010B:逻辑与
  • or al, 10110010B:逻辑或

     

db dw dd dup

  • db:定义字节型数据
  • dw:定义字型数据
  • dd:定义双字型数据
  • dup
    • db 3 dup (0) 相当于 db 0,0,0
    • db 3 dup (1,2) 相当于 db 1,2,1,2,1,2

 

跳转指令

jump 类型

  • jump short 标号:根据相对位移跳转 IP = IP + 8 位位移
  • jump near ptr 标号:IP = IP + 16 位位移
  • jump far ptr 标号:CS = 标号所在段的段地址;IP = 标号在段中的偏移地址
  • jump 16位reg:转移地址在寄存器中 IP = (reg)
  • jump word ptr 内存:IP = (内存)
  • jump dword ptr 内存:CS = (内存+2);IP = (内存)
  • jcxz 标号:(cx) == 0 时,(IP) = (IP) + 8 位位移

call 和 ret / iret 类型

  • ret:形象解释相当于 pop IP
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • retf:形象解释相当于 pop IP;pop CS
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
    • (CS) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • iret:形象解释相当于 pop IP;pop CS;popf
  • call 标号:形象解释相当于 push IP;jmp near ptr 标号
    • (sp) = (sp) – 2
    • ((ss) * 16 + (sp)) = (IP)
    • (IP) = (IP) + 16 位位移
  • call far ptr 标号:形象解释相当于 push CS;push IP;jmp near ptr 标号
  • call 16位reg:形象解释相当于 push IP;jmp 16位reg
  • call word ptr 内存单元:形象解释相当于 push IP;jmp word ptr

子程序标准模板

子程序中使用的寄存器入栈

子程序内容

子程序中使用的寄存器出栈

返回(ret、retf)

 

rep movsb

  • 传送的源地址:ds:si
  • 传送的目的地址:es:di
  • 传输长度:cs
  • 传输方向:cld 为正向

 

端口读取

  • in al, 20h
  • out 20h, al

如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要

mov al, 2
out 70h, al
in al, 71h

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2713.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类

  • origin画直线有锯齿_ps怎么让圆边缘没有锯齿

    origin画直线有锯齿_ps怎么让圆边缘没有锯齿使用环境(蓝色粗体字为特别注意内容)1、软件环境:Win732bit,OriginPro2018C.在使用Origin或者OriginPro画图的时候可能会遇到两个细节问题,1)曲线有锯齿,2)点与点之间的连线很尖锐,平滑。网上很多资料都提到Origin曲线平滑的问题,经笔者考究,所述的并不是本文中所指的点与点之间平滑的问题。废话少说,下面来看看原始数据:0.750.950….

  • navicat连接oracle数据库失败_mysql数据库连接失败

    navicat连接oracle数据库失败_mysql数据库连接失败1、Navicat连接数据库失败,可能与密码、权限有关。报警内容:1251-Clientdoesnotsupportauthenticationprotocolrequestedbyserver;considerupgradingMySQLclient。解决办法:mysql-uroot-p,打开数据库,输入如下两条命令,问题解决。ALTERUSER’root’@’localhost’IDENTIFIEDWITHmysql_native_passwordBY’密码’;

    2022年10月10日
  • python常用模块大全_日常办公会用到的python模块

    python常用模块大全_日常办公会用到的python模块mathmath.ceil(a):用来返回≥a的最小整数math.floor(a):用来返回≤a的最大整数round(a[,b])如果没有参数b,只有a,round()作用是四舍五入如果

  • 遍历map的四种方法

    遍历map的四种方法 Map.entrySet()这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Value),而Set<Map.Entry<K,V>>表示一个映射项的Set。Map.Entry里有相应的getKey和getValue方法,即JavaBean,让我们能够从一个项中取出…

  • netstat和netstat -ano

    netstat和netstat -ano(1)在命令行窗口中输入netstat后应该怎能读呢?本机地址为10.1.127.144,本机的52051端口正在和IP地址为183.192.164.67的8864端口进行通信,而且通信使用的是TCP协议(本机使用52021端口,对方使用8864端口)(2)在命令行中输入netstat-ano可以看出多了PID这一列(表示是PID为这个数的程序正在占用某个端口和外部某台机器的某个端口进行通信)所以netstat-ano比netstat能显示更多的信息,是升级版本,plus版本

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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