• 汇编1.基础


    dosbox的使用

    1. 解压出来, 运行: dosbox.exe

    2. 将主机的文件夹挂载到模拟器中, 为了能够让模拟器操作主机中的文件.

      1. mount C: d:dosbox mount C: . (一个点是挂载exe所在当前目录)

      2. C: - 表示的是模拟器中的路径.

      3. d:dosbox - 主机中的路径

      4. 将主机中的文件夹挂载到模拟器C盘

    3. 输入盘符,切换到挂载好的盘中.

    4. 启动debug

      1. 命令:

        1. 寄存器 : r - 查看/修改寄存器

          1. 修改寄存器 r ax

        2. 内存相关: d - 查看内存 , e-修改内存

          1. 查看内存: d 1000:200

          2. 修改内存: e 1000:200

        3. 运行相关: t - 单步步入 , p - 单步步过

        4. 反汇编相关:

          1. a - 进行汇编, a 1000:200 输入汇编代码

          2. u - 查看汇编 u 1000:200

        5. 退出调试器: q

      2. 使用TD.exe

     

    16位汇编指令

    指令帮助文档

    • imm - 立即数,操作数可以是数字. 后面带有数字,例如imm8,imm16,数字表示立即数的字节数.

    • reg - 表示通用寄存器种的任意一个, 后面带有数字,例如reg8,reg16; , 表示只能使用特定大小的寄存器, 例如, 如果是reg8就只能使用al,ah,bl,bh,cl,ch,dl,dh中的一个.如果是reg16,就不能使用al这种的8位寄存器.

    • seg/sreg - 表示段寄存器.只能是cs,ds,es,ss

    • mem - 表示内存, 后面带有数字,例如mem8,mem16,表示读写内存的字节数. 表示内存操作数大小时, 需要使用byte ptr,word ptr,dword ptr, 例如: byte ptr ds:[1000],表示能从ds:[1000]读写1个字节.

    dword ptr ds:[1000],表示能从ds:[1000]读写4个字节.

    汇编指令的使用规则

    1. 操作数只能是: 数字, 寄存器, 内存3种

    2. 两个操作数的大小必须一样.

      1. mov [1000h] , 100; 错误指令,无法确定内存操作数的大小,也无法确定立即数的大小. 改成mov word ptr [1000h],100

      2. mov ax , 10, 正确的, 如果已经确定了其中一个操作数的大小的时候, 另一个操作数的大小不用给出, :mov [1000h],ax ,此处虽然没有给出内存操作数的大小, 但是ax的大小是固定不变的, 因此, 内存操作数的大小就可以使用ax的大小来确定,就是word ptr.

    3. 两个操作数不能同时都是内存.

      1. mov [1000h],[1004h] 改成: mov ax,[1004h]; mov [1000h],ax

    4. 目标操作数不能是数字

      1. mov 1 , ax 错误

    数据传输指令

    • mov - 将源操作数赋值到目标操作数

    • xchg - 交换两个操作数.

    • 栈操作有关的指令:

      • push - 将一个数值压入内存中(内存的地址由sp寄存器来提供)

      • pop - 将一个数值从内存提取出来,保存到目标操作数中内存地址由sp寄存器提供)

      • pushf/popf - 将标志寄存器的内容压入/弹出栈

      • pusha/popa - 将所有寄存器状态压入/弹出堆栈

        • 压入的顺序: ax,cx,dx,bx,sp,bp,si,di

        • 出栈的顺序, 和压入的顺序相反.

    算术运算指令

      • inc -自增1

      • add - 加法 , 将源操作数累加到目标操作数上. 相当于+=

      • dec - 自减1

      • sub - 减法, 将源操作数累减到目标操作数上, 相当于-=

      • 无符号乘法

        • mul 只有一个操作数, 使用al/ax作为默认操作数, 相乘得到的结果保存到ax/dx:ax中.

      • 有符号乘法

        • imul 单操作数, 使用al/ax作为默认操作数, 相乘得到的结果保存到ax/dx:ax中.

        • imul 双操作数, 源操作数乘以目标操作数, 结果存放到目标操作数中.

        • imul 三操作数, 后两个操作数相乘,结果存放到第一个操作数.

    • 除/取余

      • 无符号除法

        • div - 单操作数, 操作数是除数, 被除数是al/dx:ax, 8位运算时,商保存在al,余数保存在ah,16位运算, 商保存在ax,余数保存在dx

      • 有符号:

        • idiv 单操作数, 使用和div一样.

    位操作指令

    • 移位运算:

      • shl - 左移运算

      • shr - 右移运算

      • and 按位与

      • or 按位或

      • not 按位取反

     

     

    课后作业

    使用汇编语言将下列算式给翻译出来,只允许使用ax,bx,cx和sp寄存器,可以使用栈

    int a=10;
    int b=20;
    int c=4;
    a = (a << c) * (a>>c) / ((c ^ a) | (c ^b )) - (++c + --a)
    部分示例:
    mov ax,10;
    mov bx,20;
    mov cx,4;

     

     

  • 相关阅读:
    又见博弈
    两道来自CF的题
    温习及回顾
    笔试面试总结
    Python Cha4
    初学ObjectiveC
    设计模式汇总(三)
    转贴XML的写法建议
    让从Objec中继承的类也拥有鼠标事件
    关于异常处理的一些看法
  • 原文地址:https://www.cnblogs.com/ltyandy/p/11039837.html
Copyright © 2020-2023  润新知