• 汇编语言总结


    1、基础知识

    寄存器CPU存储地址信息

    物理地址 = 基础地址 + 偏移地址
    基础地址 = 段地址 * 16(10H)

    段地址:偏移地址
    ds     si
    es     di
    ss     bp
    cs     ip
         sp
         bx

    CS:IP 所指向的内存地址都是指令
    指令执行的过程:
    1、CPU从cs:ip所组成的地址中读取指令,将这个指令存放到指令缓存器中
    2、IP = IP + 所读指令的字节数
    3、执行指令缓存器中的内容,回到步骤1,重复这个过程


    转移指令
    能够修改IP或者CS 或者同时修改的指令
    jmp 2000:0
    jmp 寄存器

    r 查看寄存器
    d 查看段地址:偏移地址
    u 查看CS:IP后的指令
    a 段地址:偏移地址
    e 段地址:偏移地址
    t 执行CS:IP指向的指令
    p 执行完成 程序返回
    g 地址 跳到指定的地址,地址之前将执行

    题目

    debug实验
    1、使用debug,将下列程序写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的变化
    mov ax,4E20H     ax=4E20H
    add ax,1416H     ax=6236H
    mov bx,2000H     bx=2000H
    add ax,bx        ax=8236H
    mov bx,ax        bx=8236H
    add ax,bx       ax=046CH
    mov ax,001AH     ax=001AH
    mov bx,0026H     bx=0026H
    add al,bl        ax=0040H
    add ah,bl        ax=2640H
    add bh,al        bx=4026H
    mov ah,0        ax=0040H
    add al,bl        ax=0066H
    add al,9CH      ax=0002H

    2,将下列3条指令写入从2000:0 开始的内存单元中,利用这3条指令计算2的8次方
    move ax,1
    add ax,ax
    jmp 2000:3

    答案:

    先将cs:ip 变成2000:0
    然后运行上面这三条指令,add ax,ax运行八次就是2的8次方

    移动指令
    mov 寄存器,数据 mov ax,10H
    mov 寄存器,寄存器 mov ax,bx
    mov 寄存器,内存单元 mov ax,ds:[0]
    mov 内存单元,寄存器 mov ds:[0],ax
    mov 段寄存器,寄存器 mov ds,1000H -> mov ds,bx
    mov 寄存器,段寄存器 mov bx,ds

    运算指令
    add 寄存器,数据 add ax,1
    add 寄存器,寄存器 add ax,bx
    add 寄存器,内存单元 add ax,ds:[0]
    add 内存单元,寄存器 add ds:[0],ax

    sub 寄存器,数据 sub ax,1
    sub 寄存器,寄存器 sub ax,bx
    sub 寄存器,内存单元 sub ax,ds:[0]
    sub 内存单元,寄存器 sub ds:[0],ax



    是一段连续的内存空间,也就是连续的内存地址
    2种特殊的访问方式

    段地址:偏移地址
    ss sp

    入栈 push 字型数据 -> 数据从哪里来
    出栈 pop 字型数据 -> 数据取出到哪里

    push -> sp - 2 -> 将从哪里来的字型数据存放到ss:sp
    pop -> ss:sp字型数据拿出来哪里 -> sp+2

    安全的内存写入 0:200H~0:2FFH是安全的
    保护模式 实模式
    0:7E00H


    [bx]和loop指令

    ds:[bx] 访问数据
    loop 循环指令 cx = cx - 1 判断cx是否等于0

    or ax,bx
    and ax,bx
    ds:[bx+5] 偏移地址的组合

    取 ds:[bx+si]
    存 es:[bx+di]
    ds:[bx+si+4]
    es:[bx+di+4]

    ss:[bp]
    ss[bp+si+2]

    mov word ptr ds:[0],1122
    mov byte ptr ds:[0],11


    除法div
    1,除数: 8bit 16bit 在内存单元中 或者 寄存器中
    2,被除数 AX或者 AX和DX中
    如果除数为8bit,被除数则为16bit,存放在AX中
    如果除数为16bit,被除数则为32bit,AX存放低16bit,DX存放高16bit
    3,结果: 如果除数为8bit,则AL存商,AH存放余数
    如果除数为16bit,则AX存放商,DX存放余数

    div bx/bl

    100001/100
    AX = 86A1H, DX = 1H , BX = 64H
    div bx
    AX = 3E8, DX = 1

    1001/100
    AX = 3E9, BL = 64H
    div bl
    AX = 010A

    db 占一个字节
    dw 占两个字节
    dd 占四个字节

    cnt dup 重复cnt次

    jmp word ptr ds:[0]
    jmp dword ptr ds:[0]

    条件转移指令
    jcxz 标号
    当cx等于0时

    B800:0 开始显示屏幕字符,一行80个,160字节
    有25行
    偶数为ASCLL码,奇数修改前面存放的颜色
    7 6 5 4 3 2 1 0

    7号位置闪烁
    6号位置R = red 背景
    5号位置g = green 背景
    4号位置R = bule 背景

    3号位置高亮
    2号位置r = red 前景
    1号位置g = green 前景
    0号位置b = bule 前景


    CALL和RET指令
    call 将ip存起来
    ret 近转移 IP
    retf 段间转移 它修改CS和IP

    cal -> push ip
    cal far ptr s -> push ip push cs
    ret -> pop ip
    retf -> pop ip, pop cs

    call word ptr ds:[0]
    call dword ptr ds:[0] push cs, push ip

    mul al ah ax,dx


    标志寄存器
    15   14   13   12   11   10   9   8   7   6   5   4   3   2   1   0
                  OF   DF    IF      TF      SF      ZF            AF     PF       CF

    标志 真 假
    OF OV NV OV = 溢出
    SF NG PL NG = 负数 PL = 正数
    ZF ZR NZ ZR = Zero NZ = not Zero
    PF PE PO PE = 1是偶数(Even) odd奇数
    CF CY NC CY = Carry Yes (进位)
    DF DN UP


    adc 32加法 ax低16bit dx高16bit
    abb 32减法 ax低16bit dx高16bit


    cmp ax,bx 修改标志位

    ax = bx zf = 1
    ax != bx zf = 0
    ax < bx cf = 1
    ax > bx cf = 0 并且 zf = 0

  • 相关阅读:
    每天一个linux命令---mount
    java反射机制
    每天一个linux命令---netstat
    oracle调试存储过程
    ora-14400插入的分区关键字未映射到任何分区---oracle数据库表过期问题
    Java类加载
    nginx学习笔记
    web工程spring+ibatis单元测试
    每天一个Linux命令---tcpdump
    每天一个linux命令---导出到文件
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/10085641.html
Copyright © 2020-2023  润新知