用dosbox使用debug运行debug, a命令输入了大概10多条汇编指令后, 地址后面出现个小三角, 然后就不能输入任何代码了

[Hb-I] 查看CPU和内存 用汇编指令编程 - 博客频道 - CSDN.NET
For Future Freely.
分类:-[小西南]-
《汇编语言·第三版》--王爽
Debug是DOS(Disk Operating System,磁盘操作系统)、windows提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
用到的Debug参数:
r命令查看、修改CPU寄存器的内容;d命令查看内存中的内容;e命令改写内存中的内容;u命令将内存中的机器指令翻译成汇编指令;t命令执行一条机器指令;a命令以汇编指令的格式在内存中写入一条机器指令。
2 Win 7 64位调debug
安装DOSBOX后打开DOSBOX,将debug.exe拷贝到F盘(某盘根目录),在DOSBOX中输入“mount c f:\”命令(此命令输入后有“Drive C is mounted as local directory f:\”,再输入“c:”回车。然后就可以去实现《汇编语言·第三版》—王爽P.45的实验任务了。
DOSBOX和debug.exe。
3 用debug向指定内存写入汇编指令并执行
(1) 查看CPU各寄存器中的值
Figure1. debug r命令查看CPU内各寄存器的值
CS:IP当前指向的内存地址为(073F0 +0100),此地址里面的二进制内容翻译成汇编语句为ADD [BX+SI], AL。
(2) 向指定内存地址输入汇编指令
向内存地址CS:IP = 073F:0000写入以下框内的汇编指令,并执行它们,观察CPU各寄存器值的变化。
mov&&&&&&& ax, 4E20H
add&&&&&&& ax, 1416H
mov&&&&&&& bx, 2000H
add&&&&&&& ax, bx
mov&&&&&&& bx, ax
add&&&&&&& ax, bx
mov&&&&&&& ax, 001AH
mov&&&&&&& bx, 0026H
add&&&&&&& al, bl
add&&&&&&& ah, bl
add&&&&&&& bh, al
mov&&&&&&& ah, 0
add&&&&&&& al, bl
add&&&&&&& al, 9cH
[1] 向指定内存地址写入汇编指令
Figure2. 用debug a命令向指定内存写入汇编指令
内存073F:0000 – 073F:001F段内保存了这些汇编指令。
[2] 修改CS:IP内容
CS:IP内的内容代表即将访问的内存地址。要求将这段指令写入起始地址为CS:IP = 073F:0000的段内,那么只需要修改IP的值即可:
Figure3. 修改IP的值
[3] 执行汇编指令
在[2]后,CS:IP指向内存073F:0000即刚输入汇编指令的首地址。
Figure4. 用debug t命令执行汇编指令
4 查看内存中的内容
PC机主板上的ROM中写有一个生产日期,在内存FFF00H ~ FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
Figure5. 修改ROM内容
用debug e命令修改FFF0:0050内容无效,因为这个地址表示ROM的地址,是只读的。
5 向内存从B8100H开始的单元中填写数据
Figure6. 向B8100内存地址写入数据
B810:0000地址属显存部分,当向这个内存中写入数据时会显示到屏幕上来。
8086PC机内存地址空间分配:
00000 ~ 9FFFF:主存储器地址空间(RAM);A0000 ~ BFFFF:显存地址空间;C0000~ FFFFF:各类ROM地址空间。
[ - 19:52]
R《Hb》Note Over.
排名:第615名
(2)(406)
--------老师--------
--------室友--------debug32 汇编指令add ax,[0]出错问题 | Hello world!小组 | 果壳网 科技有意思
126433人加入此小组
我开了两个dosbox这是第一个dosbox用debug,输入add ax,[0]没问题这是第二个dosbox用debug32,输入add ax,[0]就出问题了add ax,[2]和add ax,[4]都没问题啊!为什么?怎么解决?并不是我非要用debug32,只是我想知道为什么会这样子。
+ 加入我的果篮
难道[0]是32位的,[2]和[4]是16位的?(因为没用过debug32)
debug32明显是32位的嘛。快去用386指令集啦,不要用8086的指令啦你个相对寻址的准找到一个32位的子肯定放不进去ax啦,快去放eax啦
引用 的话:debug32明显是32位的嘛。快去用386指令集啦,不要用8086的指令啦 你个相对寻址的准找到一个32位的子肯定放不进去ax啦,快去放eax啦那么为什么add ax,[2]add ax,[4]就可以?你说既然是32位,那么debug32为什么不用dosbox运行不了?
引用 的话:那么为什么 add ax,[2] add ax,[4] 就可以? 你说既然是32位,那么debug32为什么不用dosbox运行不了?debug32不是纯32位的啦。80286那种准32的东西吧,只是支持32位啦自己看啦。32位的汇编就不会有问题了
引用 的话:debug32不是纯32位的啦。80286那种准32的东西吧,只是支持32位啦
你给的这三个连接能看出什么了?
引用 的话:你给的这三个连接能看出什么了?十六位的汇编 add ax,[0] 是当成立即数处理的
引用 的话:十六位的汇编 add ax,[0] 是当成立即数处理的那解决方法呢?如果是被当成立即数为何mov ax,0 和add ax,0 就可以?
引用 的话:那解决方法呢? 如果是被当成立即数为何mov ax,0 和add ax,0 就可以?mov ax, [0]和mov ax, ds:[0]等价正在怀疑你有没有看那些链接……
引用 的话:mov ax, [0]和mov ax, ds:[0]等价 正在怀疑你有没有看那些链接……我看过什么结论都没有而且mov ax,ds:[0]都试过了,无效
引用 的话:我看过什么结论都没有 而且mov ax,ds:[0]都试过了,无效大概这个恶心的调试器是没开源的,我去试一试反汇编一下吧明明debug都支持这样……
引用 的话:大概这个恶心的调试器是没开源的,我去试一试反汇编一下吧 明明debug都支持这样……要是我懂反汇编的话,这个问题还用发帖问大家吗?
引用 的话:要是我懂反汇编的话,这个问题还用发帖问大家吗?花了一晚上反汇编也没找到关键代码。决定放弃了,又不是什么重要的软件……恶心的16位的段寻址,实在是受够了。我这里还没有办法调试(懒得用bochs调)。基本是静态分析加上内存dump。没法加内存断点实在是太恶心了看了一下生成的机器码,debug和debug32的机器码是不一样的debug32在mov ax,[1]之类的生成的是8B 06 01 00
意思就是通过相对寻址把[01 00]一个字发送到ax寄存器debug的mov ax,[1]生成的代码就不是这样,是A1 01 00。mov ax,[0]就是A1 00 00于是我去手动修改了debug32生成的8B 06 01 00 ,改成了8B 06 00 00。反汇编,发现显示的就是mov ax,[0]。单步执行没问题,能跑你就无视掉debug32这个奇葩货吧(废了一晚上时间wwww
引用 的话:花了一晚上反汇编也没找到关键代码。决定放弃了,又不是什么重要的软件……恶心的16位的段寻址,实在是受够了。我这里还没有办法调试(懒得用bochs调)。基本是静态分析加上内存dump。没法加内存断点实在...辛苦了,又是昨晚。我发现只要中间加条指令就可以了,例如mov ax,0mov si,0mov [si],ax
引用 的话:花了一晚上反汇编也没找到关键代码。决定放弃了,又不是什么重要的软件……恶心的16位的段寻址,实在是受够了。我这里还没有办法调试(懒得用bochs调)。基本是静态分析加上内存dump。没法加内存断点实在...我刚才也试了一下,发现在debug里8b060100跟a10100也能是同样的汇编指令,不说直接上图这是debug的这是debug32的
引用 的话:我刚才也试了一下,发现在debug里8b060100跟a10100也能是同样的汇编指令,不说直接上图 这是debug的 这是debug32的这两种指令都是8086的指令啦,8086的不同的mov有好几十个……debug32能够识别是自然的,debug32还兼容32位的指令(貌似不检查A20)我只是想说这两种调试器默认生成的指令是不同的……严重怀疑这是debug32的bug(或者是其他的什么奇怪的安全检查?不知道……)不过我没太听懂你说的中间加一个指令就可以了,求详细
引用 的话:这两种指令都是8086的指令啦,8086的不同的mov有好几十个……debug32能够识别是自然的,debug32还兼容32位的指令(貌似不检查A20) 我只是想说这两种调试器默认生成的指令是不同的…...原指令mov [0],ax往ds:[0]写ax的内容,这是我的目的那么写成这样 mov ax,0 mov si,0 mov [si],ax三条指令执行的结果跟效果mov [0],ax一样啦
引用 的话:原指令 mov [0],ax 往ds:[0]写ax的内容,这是我的目的 那么写成这样 mov ax,0 mov si,0 mov [si],ax 三条指令执行的结果跟效果mov [0],a...所以我认为用一条指令就可以的,debug32用三条指令或者要手动修改二进制才能实现一定是bug
引用 的话:所以我认为用一条指令就可以的,debug32用三条指令或者要手动修改二进制才能实现一定是bug未必是bug可能这样做是为了规范使用者的习惯。直接用文本编辑器编辑的汇编代码中用 mov [0],ax也不能通过masm的编译
(C)2016果壳网&&&&&京ICP备号-2&&&&&#汇编语言#我尝试用 in 和 out 指令读取和写入 CMOS 的两个寄存器,为什么失败了?我用debug进行调试发现是70h寄存器写入失败。我是在Windows 8.1中使用 DOSBOX 模拟的纯DOS环境。应该不是环境的问题吧,因为以前都用得好好的。
#汇编语言#我尝试用 in 和 out 指令读取和写入 CMOS 的两个寄存器,为什么失败了?我用debug进行调试发现是70h寄存器写入失败。我是在Windows 8.1中使用 DOSBOX 模拟的纯DOS环境。应该不是环境的问题吧,因为以前都用得好好的。
补充:下面贴上源码:assume cs:codecode segment mov al,2 out 70h,al in al,70h in al,71h mov al,0 out 71h,al in al,71hcode endsend
模拟器没用过。
不用模拟器,只要不对外设进行操作,问题不大。要对外设进行in或out操作,还是在dos下做吧!
不好意思,问题还是没解决啊
在win下,不能用dos程序写bios !
的感言:赞!很赞!非常赞!从来没有这么赞过!
相关知识略懂社热议等待您来回答
编程领域专家
& &SOGOU - 京ICP证050897号}

我要回帖

更多关于 dosbox debug 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信