鱼C论坛

 找回密码
 立即注册
查看: 2705|回复: 6

[已解决]汇编问题3.1小甲鱼的机器测试截图 自己做找不到答案,求过程

[复制链接]
发表于 2019-8-11 09:37:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(1)在Debug中,用“d 0000:0000 1f”查看内存,结果如下
0000:0000 70 80 F0 30  EF  60 30  E2-00   80  80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值。
mov ax, 1
mov ds, ax
mov ax, [0000]  AX = 2662
mov bx, [0001]  BX = E626
mov ax, bx         AX = E626
mov bx, [0000]  AX = 2662
mov bx, [0002]  BX = D6E6
add  ax, bx         AX = FD48
add  ax, [0004]  AX = 2C14
mov ax, 0           AX = 0000
mov ax, [0002]  AX = 00E6
mov bx, 0           BX = 0000
mov bl, [000C]  BX = 0026
add  al, bl           AX = 000C

(2)内存中的情况如图3.6所示
各寄存器的初始值:CS = 2000H, IP = 0, DS = 1000H, AX = 0, BX = 0;
1 写出CPU执行的指令序列(用汇编指令写出)。
2 写出CPU 执行每条指令后,CS、IP和相关寄存器中的数值。
3 再次体会:数据和程序有区别吗?如何确定内存中的信息那些是数据,那些是程序?
mov ax, 6622H    把6622H付给ax寄存器
jmp 0ff0:0100      跳转到内存地址10000H 段地址是0ff0偏移地址0100
mov ax, 2000H    把2000H付给ax寄存器
mov ds, ax            把通用寄存器ax中的数据2000H付给ds寄存器
mov ax, [0008]     把数据段地址2000H内存单元地址0008中的数据C389付给ax每个ax接受一个字两个字节的数据如果指定的是89那调入到ax中就缺少一个字节所以自动加上下一个地址段中的字节C3。
mov ax, [0002]     把数据段地址2000H内存单元地址0002中的数据付给ax每个ax接受一个字两个字节的数据道理同上。

mov ax, 6622H    AX:6622  BX:0000 CS:2000 IP:0003  DS:1000
jmp 0ff0:0100      AX:6622  BX:0000 CS:0ff0  IP:0100  DS:1000
mov ax, 2000H    AX:2000  BX:0000 CS:0ff0  IP:0103   DS:1000
mov ds, ax           AX:2000   BX:0000 CS:0ff0  IP:0105  DS:2000
mov ax, [0008]    AX:C389  BX:0000 CS:0ff0  IP:0108  DS:2000
mov ax, [0002]    AX:EA66  BX:0000 CS:0ff0  IP:010B DS:2000

这个是答案,问题是我自己做得不到这答案
最佳答案
2019-8-11 22:46:56
本帖最后由 jackz007 于 2019-8-11 23:53 编辑

       1、这道题的设定情景有非常大的问题,首先,0000:0010~0000:001F 这段内存属于操作系统区域,是用来存放 DOS 操作系统中断向量表的,这段内存每台机器既不一样也不能修改,根本无法重现题目中所描述的情景;

       2、第 2 题要求分别从固定的内存地址 2000:0000 和 0FF0:0100 编写代码,并进行跟踪,除非这 2 段内存地址都是未使用的自由空间,否则,修改代码的操作会直接危害到操作系统安全,也可能会破坏 debug.exe 本身占用的内存空间,从而造成非常严重的问题,使 debug 无法运行,预期的任务就不能完成。
       比如,在我这里,debug.exe 启动时的,CS:IP 是 13E5:0100,在我输入 0FF0:0100 处汇编代码的过程中,debug.exe 竟然意外退出,原因显然是我的行为严重破坏了 debug.exe 的运行环境,才会有这样的结果。

       所以,这 2 道题的设置并不能确保每个人都能够 100% 完成。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-11 22:46:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-8-11 23:53 编辑

       1、这道题的设定情景有非常大的问题,首先,0000:0010~0000:001F 这段内存属于操作系统区域,是用来存放 DOS 操作系统中断向量表的,这段内存每台机器既不一样也不能修改,根本无法重现题目中所描述的情景;

       2、第 2 题要求分别从固定的内存地址 2000:0000 和 0FF0:0100 编写代码,并进行跟踪,除非这 2 段内存地址都是未使用的自由空间,否则,修改代码的操作会直接危害到操作系统安全,也可能会破坏 debug.exe 本身占用的内存空间,从而造成非常严重的问题,使 debug 无法运行,预期的任务就不能完成。
       比如,在我这里,debug.exe 启动时的,CS:IP 是 13E5:0100,在我输入 0FF0:0100 处汇编代码的过程中,debug.exe 竟然意外退出,原因显然是我的行为严重破坏了 debug.exe 的运行环境,才会有这样的结果。

       所以,这 2 道题的设置并不能确保每个人都能够 100% 完成。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-12 11:04:32 | 显示全部楼层
主要我是一个小白,需要的是过程可以看看吗,感觉是自己过程哪里错了,可以截图吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-12 11:33:57 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-12 12:28 编辑

    第1题:
-d 0001:0000 l10

0001:0000  8B 01 70 00 B9 06 10 02-40 07 10 02 FF 03 10 02   ..p.....@.......
-a
13F0:0100 xor ax,ax
13F0:0102 xor bx,bx
13F0:0104 mov ax,1
13F0:0107 mov ds,ax
13F0:0109 mov ax,[0]
13F0:010C mov bx,[1]
13F0:0110 mov ax,bx
13F0:0112 mov bx,[0]
13F0:0116 mov bx,[2]
13F0:011A add ax,bx
13F0:011C add ax,[4]
13F0:0120 mov ax,0
13F0:0123 mov ax,[2]
13F0:0126 mov ax,0
13F0:0129 mov ax,[2]
13F0:012C mov bx,0
13F0:012F mov bl,[c]
13F0:0133 add al,bl
13F0:0135 

-u 100 134

13F0:0100 31C0          XOR        AX,AX          ; AX = 0000                             
13F0:0102 31DB          XOR        BX,BX          ; BX = 0000                    
13F0:0104 B80100        MOV        AX,0001        ; AX = 0001                    
13F0:0107 8ED8          MOV        DS,AX          ; DS = 0001                    
13F0:0109 A10000        MOV        AX,[0000]      ; AX = 018B                   
13F0:010C 8B1E0100      MOV        BX,[0001]      ; BX = 7001                   
13F0:0110 89D8          MOV        AX,BX          ; AX = 7001                             
13F0:0112 8B1E0000      MOV        BX,[0000]      ; BX = 018B                    
13F0:0116 8B1E0200      MOV        BX,[0002]      ; BX = 0070                    
13F0:011A 01D8          ADD        AX,BX          ; AX = 7071                             
13F0:011C 03060400      ADD        AX,[0004]      ; AX = 772A                   
13F0:0120 B80000        MOV        AX,0000        ; AX = 0000                    
13F0:0123 A10200        MOV        AX,[0002]      ; AX = 0070                   
13F0:0126 B80000        MOV        AX,0000        ; AX = 0000                           
13F0:0129 A10200        MOV        AX,[0002]      ; AX = 0070                    
13F0:012C BB0000        MOV        BX,0000        ; BX = 0000                    
13F0:012F 8A1E0C00      MOV        BL,[000C]      ; BL = FF                    
13F0:0133 00D8          ADD        AL,BL          ; AL = 6F                    
-q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-12 12:08:38 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-12 12:25 编辑

      第 2 题,debug 入口是 13F0:0100,首先在程序入口,构筑程序起始条件:DS = 1000,AX = 0,BX = 0
-a
13F0:0100 mov ax,1000
13F0:0103 mov ds,ax
13F0:0105 xor ax,ax
13F0:0107 xor bx,bx
13F0:0109 jmp 2000:0
13F0:010E 

      然后,编写题目要求的目标代码
-a 2000:0
2000:0000 mov ax,6622
2000:0003 jmp 2ff0:0100
2000:0008 

-a 2ff0:0100
2FF0:0100 mov ax,2000
2FF0:0103 mov ds,ax
2FF0:0105 mov ax,[8]
2FF0:0108 mov ax,[2]
      由于段地址 0FF0 目前属于已占用内存,为了安全起见,把原来预设的下一个代码段地址 0FF0 更改为 2FF0
      下面是目标数据 2000:0000 ~ 2000:0010 的实际内存数据
2000:0000  B8 22 66 EA 00 01 F0 2F-00 00 00 00 00 00 00 00   ."f..../........
       最后得到:
-d 2000:0 l10
2000:0000  B8 22 66 EA 00 01 F0 2F-00 00 00 00 00 00 00 00   ."f..../........

-u 100 10d
13F0:0100 B80010        MOV        AX,1000       ; AX = 1000
13F0:0103 8ED8          MOV        DS,AX         ; DS = 1000
13F0:0105 31C0          XOR        AX,AX         ; AX = 0000
13F0:0107 31DB          XOR        BX,BX         ; BX = 0000
13F0:0109 EA00000020    JMP        2000:0000     ;CS = 2000,IP = 0000

-u 2000:0 l7
2000:0000 B82266        MOV        AX,6622       ; AX = 6622
2000:0003 EA0001F02F    JMP        2FF0:0100     ; CS = 2FF0,IP = 0100

-u 2ff0:100 la
2FF0:0100 B80020        MOV        AX,2000       ; AX = 2000
2FF0:0103 8ED8          MOV        DS,AX         ; DS = 2000
2FF0:0105 A10800        MOV        AX,[0008]     ; AX = 0000
2FF0:0108 A10200        MOV        AX,[0002]     ;AX = EA66
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-12 17:49:36 | 显示全部楼层
可以发一个图片吗,我主要不确定过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-12 18:19:56 | 显示全部楼层
问题
1、XOR是什么命令
2、题目d查看的是d 0000:0000 1f你写的是d0001:0000 110
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-5 16:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表