当前位置: 首页 > article >正文

2-4、DEBUG和源程序区别

语雀原文链接

文章目录

    • 1、DEBUG 和 汇编编译器MASM
      • 区别1:默认进制不同
      • 区别2:[地址]
        • 示例1:debug
        • 示例2:[0]
        • 示例3:[寄存器]
        • 示例4:ds:[0]
        • 小结
      • 区别3:源程序数据不能以字母开头

1、DEBUG 和 汇编编译器MASM

  • 之前的学习中,我们可以通过debug a命令写入汇编指令;也可以通过编写一个xx.asm源文件,通过编译链接,最终运行该程序。这两种方式在写法上有细微差别,同样的写法在这两个方式下可能会产生不同的结果。
  • 下面我们就对这些差异点做详细的描述

区别1:默认进制不同

  • 在debug中,默认所有数字都是 16 进制,加了 h 反而会报错;
  • AX=1234

image.png

  • DEBUG中主动添加进制标识会报错

image.png

  • 在汇编源程序 .asm 中,不加 h 则默认为 10 进制,加 h 才表示 16 进制,加 b 为后缀为二进制;下述写法会报错

image.png

assume cs:code
code segment
        mov ax,0fff
code ends
end
  • asm源程序的正确写法
assume cs:code
code segment
        mov ax,0fffH
        mov bx,1234
code ends
end
  • 使用 debug 跟踪可执行程序 .exe 的时候,debug会将不加 h 的 10 进制(或者加了b为后缀的二进制)变为对应的 16 进制。

区别2:[地址]

  • DEBUG中会将[0]、[1]也就是2000:0 2000:1单元中数据送入al bl cl dl,符合我们的预期
示例1:debug
  • 写入指令a

image.png

  • 查看u

image.png

  • 执行t

image.png

示例2:[0]
  • 使用
assume cs:code
code segment
	mov ax,2000H
	mov ds,ax
	mov al,[0]
	mov bl,[1]
	mov cl,[2]
	mov dl,[3]
code ends
end
  • 上述代码编译链接后运行,mov al,[0]最终被解释成了mov al,00,被当成了一个数据而不是内存单元的偏移地址

image.png
image.png

示例3:[寄存器]
  • 为了解决上述问题,可以使用[寄存器]方式来访问内存单元,此时默认的段地址保存在ds中
assume cs:code
code segment
	mov ax,2000H
	mov ds,ax
	mov bx,1
	mov al,[bx]
code ends
end
  • 执行结果

image.png

示例4:ds:[0]
  • [0]里面是一个常量,就要显式的给出段地址所在的寄存器
assume cs:code
code segment
	mov ax,2000H
	mov ds,ax
	mov al,ds:[0]
	mov bl,ds:[1]
	mov cl,ds:[2]
	mov dl,ds:[3]
code ends
end
  • 编译链接结果

image.png

小结
  • 在汇编源程序中,如果用指令访问一个内存单元,则在指令中中必须用"[…]"来表示内存单元。
    • 如果在"[]“里用一个常量idata直接给出内存单元的偏移地址,就要在”[]"的前面显式地给出段地址所在的段寄存器。比如mov al,ds:[0]
    • 如果没有在"II"的前面显式地给出段地址所在的段寄存器,比如mov al,[0],那么,编译器masm将把指令中的"[idata]“解释为"idata”。
  • 如果在"[]"里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显式地给出段地址所在的段寄存器

区别3:源程序数据不能以字母开头

  • 下述程序可以正常编译运行
assume cs:code
code segment
        mov ax,0fffh
code ends
end
  • 下述程序报错,汇编源程序中数据不能以字母开头,必要的话前面加0

image.png

assume cs:code
code segment
        mov ax,ffffh
code ends
end
  • 数据前面加个0就不会报错
assume cs:code
code segment
        mov ax,0ffffh
code ends
end

http://www.kler.cn/news/161719.html

相关文章:

  • 根据既定数组创建数组的方法汇总 (第3讲)
  • hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED
  • Kafka Connect :构建强大分布式数据集成方案
  • 【计算机网络学习之路】HTTP请求
  • C# Solidworks二次开发:三种获取SW设计结构树的方法-第一讲
  • 计算整数各位数字之和 C语言xdoj29
  • GO设计模式——11、装饰器模式(结构型)
  • uniapp实战 —— 自适配高度的可滚动区域(scroll-view的使用技巧)
  • 【Axure教程】树筛选中继器表格
  • 分布式搜索引擎elasticsearch(二)
  • 图表管理功能(前后端实现增删改查)
  • webpack学习-3.管理输出
  • vue中对pdf文件和路径的处理
  • 采样率越高噪声越大?
  • GO设计模式——13、享元模式(结构型)
  • node.js出现version `GLIBC_2.27‘ not found的解决方案
  • oomall课堂笔记
  • 软考2018下午第六题改编逻辑(状态模式)
  • 【动手学深度学习】(十)PyTorch 神经网络基础+GPU
  • QT Windos平台下打包应用程序
  • CSM2433 一款集成2.4G+125K 和8位RISC 的SOC芯片
  • 临时或永久修改linux-kali虚拟机的主机名和遇见的错误解决方法(保姆级图文)【网络工程】
  • 流量分析1--菜刀666
  • [ES]ElasticSearch强转日期的时区问题
  • 备忘录怎么传到电脑?备忘录手机电脑互传方法
  • echarts图之 底部滚动横轴 缩放图形大小
  • 软件开发安全指南
  • IDEA 保存自动ESLint格式化
  • python 涉及opencv mediapipe知识,眨眼计数 供初学者参考
  • 【Linux】进程通信之命名管道mkfifo