zoukankan      html  css  js  c++  java
  • 汇编语言全梳理(精简版)

    寄存器一览

    • 通用寄存器
      • 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 位
    结果 余数 

    寻址方式总结

    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
  • 相关阅读:
    Python 强制停止多线程运行
    自动化测试 Appium之Python运行环境搭建 Part2
    自动化测试 Appium之Python运行环境搭建 Part1
    Genymotion Android模拟器Genymotion的安装和使用
    Easyui datagrid combobox输入框下拉(取消)选值和编辑已选值处理
    性能测试 接口性能测试需要注意的点
    Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现
    lintcode:整数排序||
    lintcode:整数排序
    lintcode:玩具工厂
  • 原文地址:https://www.cnblogs.com/flashsun/p/13663050.html
Copyright © 2011-2022 走看看