• 第一章 初识debug


    8086汇编语言学习目录

    第一章 初识debug

    第二章 字与段的总结

    参考课程:CSDN贺利坚汇编视频课
    参考书籍:汇编语言 王爽
    衷心感谢老师们的耐心教导,课程和书籍都非常用心,内容十分详细,再次感谢老师们的贡献。


    前言

    汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。


    一、实践环境搭建

    根据附录里面的链接以及里面的帮助文档配置。

    • 驱动器C已经挂载到本地目录d:\masm:在dos中用到的C盘,实际上对应的是当前目录上的d盘的MASM文件夹(从解压包拷贝的)
    mount c d:\masm
    
    • 1
    • c: 转换到C盘工作,dir是查看当前目录中的文件和文件夹
    c:
    
    • 1

    二、debug的使用

    1. 启动debug

    挂载
    mount c d:\masm  
    
    进入到C盘
    c:
    
    查看
    dir
    
    启动debug
    debug
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2. R命令

    查看寄存器(R命令)
    r
    
    选择某个寄存器,并修改地址
    ax
    1234
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    请添加图片描述

    rax与r ax涵义一样

    3. D命令

    列出预设地址内存处的128个字节的内容(D命令)
    d
    
    查看内存中指定地址处的内容
    d 2000:0000
    
    列出内存中指定地址范围内的内容
    d 2000:0 f
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    请添加图片描述
    为段地址:偏移地址

    • 再次敲d,偏移量继续往下走,每一次都列出128个字节,一行是16个字节,一共是8行

    请添加图片描述
    还能指定找某个地址,如2000:0000
    请添加图片描述

    • 最后再加上结尾偏移地址,一次可以显示若干个,如f,即0-f共有16个数据;如2f,是48个数据

    请添加图片描述

    4. E命令

    改变内存中的内容(E命令)
    e 2000:0000 12 34 56 AB 3F F3
    
    逐个询问式修改; 空格 - 接受,继续; 回车 - 结束
    e 2000:0 12:61 34:41
    
    • 1
    • 2
    • 3
    • 4
    • 5

    12 34都是16进制数
    请添加图片描述
    逐个询问修改,空格是继续,回车是结束
    请添加图片描述

    5. U命令

    将内存中的机器指令翻译成汇编指令(U命令)
    先写入数据(不区分大小写)
    e 2000:0 b8 23 01 bb 03 00 89 d8 01 d8
    
    查看
    d 2000:0 f
    
    查看汇编代码
    u 2000:0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    将机器指令转换为汇编指令
    请添加图片描述

    6. A指令

    以汇编指令格式在内存中写入机器指令
    查看寄存器
    r
    
    写入汇编指令
    a 073f:100
    mov ax,0123
    mov bx,3
    mov ax,bx
    add ax,bx
    
    查看数据
    d 073f:100
    
    查看代码
    u 073f:100
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    请添加图片描述
    U查看代码
    请添加图片描述

    7. T命令

    cs是073f,IP是0100的时候,执行的是上面的代码,还能用rip修改ip

    查看寄存器
    r
    
    修改IP
    rip
    0000
    
    查看寄存器
    r
    
    用t执行指令
    t
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    请添加图片描述
    用t执行指令
    请添加图片描述

    8. q命令

    退出debug
    q
    
    • 1
    • 2

    请添加图片描述

    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了debug的使用,而使用debug可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令级跟踪程序的运行。

    附录

    8086环境下载链接(百度网盘)

    寄存器

    请添加图片描述
    请添加图片描述

    216-1为FFFFH
    H为16进制,D为10进制,B为2进制

    请添加图片描述

    AX十六位的可以看成两个八位的,AH高八位和AL低八位

    请添加图片描述

    mov和add指令

    请添加图片描述

    ADD与add是同义的
    请添加图片描述
    8266H+8266H=1044CH
    但是图中为044CH,是因为溢出问题,1超出4位(16进制)了,没法保存,即汇编中存在溢出问题

    请添加图片描述

    ax,bx都是16位,ah,bh都是高八位,al,bl都是低八位
    C5H+93H=158,但是图上为58H,1溢出了,不能进到高位去,因为al是一个八位的寄存器,两个八位作为字节的相加,结果是58,产生的进位被丢掉

    物理地址

    请添加图片描述

    • 物理地址是5位的16进制数,对应的是20位的2进制,如A0000
    • 20根地址总线,寻址能力是1M,10的20次方是1M
    • 16位地址意味寻址能力是64KB,本身寻址能力有1M这么大,中间这个巨大的差异矛盾该如何解决?

    用两个16位的地址(段地址、偏移地址)合成20位的物理地址

    请添加图片描述

    • 段地址x16是左移4个二进制位,即x16,左移一位是乘以2,左移四位就是x16,就是已经凑成20位了,再把偏移地址加上,最后得到的值就是物理地址了
    • 如上图所示的例子,四位十六进制数,左移一位,相当于二进制左移四位,再加上偏移地址00C8,得到物理地址123C8,即两个16位的地址合成20位的地址。

    两个16位地址,经过加法器运算后,得到20位地址,最后到达内存完成寻址

    请添加图片描述

    不同的段地址,经过调整偏移地址后,可以得到相同的物理地址。

    请添加图片描述

    内存的分段表示法

    • 内存本身并不分段,内存本身的逻辑地址空间是连续的,段的划分是CPU干的事情

    请添加图片描述

    • 段地址x16,最后一位一定是0,是16的倍数
    • 2的16次方位64K

    请添加图片描述

    某个单元位置表示 段地址:偏移地址,如2000:1F60,多用于书面语

  • 相关阅读:
    [源码解析] TensorFlow 分布式之 ParameterServerStrategy V1
    Redis实战案例及问题分析之单机优惠券秒杀
    基于 AdaFace 提供适合低质量人脸识别的人脸特征向量输出服务
    Kotlin高仿微信-第53篇-添加好友
    Spring Cloud框架学习-Spring Cloud Consul
    MybatisPlusGenerator代码生成工具配置教程
    mysql数据库概述及安装
    VSCode创建Vue项目完整教程
    uni-app canvas创建画布
    2022年高教社杯国赛A题思路——波浪能最大输出功率设计
  • 原文地址:https://blog.csdn.net/a208944725/article/details/126280392