2-4、DEBUG和源程序区别

语雀原文链接

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
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码充电宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值