• 汇编基础知识之二debug的使用


    DEBUG的使用

    (要在win32位习题下进行,win7 64位需要安装DosBox和debug这2个软件):

    1:win64位下debug的使用教程:

    下载debug.exe,这里我把debug放在了c盘根目录下

    下载DosBox并安装好,

    输入mount c c:  加载目录到c盘

    输入c:  进入到c盘,看到我们已经在c盘下了。

    输入debug,表示打开放在c盘下的debug工具,使用r命令,可以看到,我们进入了熟悉的debug环境。

    2:debug的基本命令:

    R  查看以及改变CPU寄存器的内容

    例如 r ax 修改ax 的内容

    D  查看内存中的内容

    E 改写内存中的内容

    U 将内存中的机器指令翻译成汇编指令

    T 执行一条机器指令

    A 以汇编指令的格式在内存中写入一条机器指令

    quit 退出debug模式

    3:实例讲解

    1)将下面3条指令写入从2000:0开始的内存单元中,利用这2条指令计算2的8次方。

      mov ax,1

      add ax,ax

      jmp 2000:0003

    (1): 说明2的8次方是256,也就是10000 0000(B)=256(十进制)=100(16进制),算到ax=0100时就是结果

    注意:debug里面的数字都是16进制的

     

    (2)然后修改cs的值为2000和ip的值为0

    可见此时的cs=2000,ip=0

    (3)使用t命令单步执行:

     

     (4)注意:jmp 0003是跳转到2000:0003内存地址,然后在相加,然后在跳转,一直循环

     

    最后的结果,现在里面的只看ax,cs,ip

    2)查看内存的内容,PC机主板上的ROM中写的一个生产日期,在内存FFF00H~~FFFFFH的某几个单元中,请找到生成日期并试图改变它。

    解析:FFF00H是20位,有段地址和偏移地址合成,FFF0段地址,0偏移地址,FFFFFH有FFF0段地址和FF偏移地址

    先修改CS为fff0,IP地址值位0

    查看内存的范围fff0:0 ff

    最右边部分是ascii的值是10进制的,中间的是16进制的,通过ascii表可查,十进制30是对应的ascii值是0(30(H)-->48(十进制),48对应的ascii是0),以此类推可得

    日期是92年1月1日。

    下面尝试修改日期,e命令是改写内存的东西

    但是日期并没有改变,因为是主板上的ROM是只读存储器,不能修改

    3)向内存从B8100H开始的单元中填写数据

      e B810:0000 01 01 02 02 03 03 04 04 

    可以看到上面出现了小图标,这是因为B810是显存的地址,修改显存的地址改变在屏幕上显示。

  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/DonAndy/p/6076033.html
Copyright © 2020-2023  润新知