汇编网首页登录博客注册
hygf99的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏
友情链接

[2010-01-12 01:00] 《汇编语言》第二章实验1

实验任务:
(1)使用DEBUG,将上面的程序段写入内存,逐条执行,观察每条指令执行后,cpu中相关寄存器中内容的变化。
  机器码          汇编指令
B8 20 4E         MOV AX,4E20H
05 16 14         ADD AX,1416H
BB 00 20         MOV BX,2000H
01 D8            ADD AX,BX
89 C3            MOV BX,AX
01 D8            ADD AX,BX
B8 1A 00         MOV AX,001AH
BB 26 00         MOV BX,0026H
00 D8            ADD AL,BL
00 DC            ADD AH,BL
00 C7            ADD BH,AL
B4 00            MOV AH,0
00 D8            ADD AL,BL
04 9C            ADD AL,9CH
提示:可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。
做法:进入DEBUG后,用A命令将以上指令写入内存,T命令单步执行:
CS:IP指向0B01:0100,指令为MOV AX,4E20H
-T
AX=4E20  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0103  NV UP EI PL NZ NA PO NC
0B01:0103 051614           ADD AX,1416
将4E20H放入AX,CS:IP指向0B01:0103
-T
AX=6236  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=OOOO
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0106  NV UP EI PL NZ NA PE NC
0B01:0106 BB0020           MOV BX,2000
将4E20H+1416H放入AX,CS:IP指向0B01:0106
-T
AX=6236  BX=2000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0109  NV UP EI PL NZ NA PE NC
0B01:0109 01D8             ADD AX,BX
将2000H放入BX,CS:IP指向0B01:0109
-T
AX=8236  BX=2000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  EX=0B01  SS=0B01  CS=0B01  IP=010B  OV UP EI NG NZ NA PE NC
0B01:010B 89C3             MOV BX,AX
将AX中的数据与BX中的数据相加,结果放入AX中。CS:IP指向0B01:010B
-T
AX=8236  BX=8236  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=010D  0V UP EI NG NZ NA PE NC
0B01:010D 01D8             ADD AX,BX
将AX中的数据放入BX,CS:IP指向0B01:010D
-T
AX=046C  BX=8236  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=010F  OV UP EI PL NZ NA PE CY
0B01:010F B81A00           M0V AX,001A
将AX中的数据与BX中的数据相加,结果放入AX中,不料溢出,舍弃最高位。CS:IP指向0B01:010F
-T
AX=001A  BX=8236  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0112  0V UP EI PL NZ NA EP CY
0B01:0112 BB2600           MOV BX,0026
将001A放入AX中,CS:IP指向0B01:0112
-T
AX=001A  BX=0026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0115  0V UP EI PL NZ NA PE CY
0B01:0115 00D8             ADD AL,BL
将0026放入BX中,CS:IP指向0B01:0115
-T
AX=0040  BX=0026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0117  NV UP EI PL NZ AC PO NC
0B01;0117 00DC             ADD AH,BL
将AL中的数据与BL中的数据相加,结果放入AL中,CS:IP指向0B01:0117
-T
AX=2640  BX=0026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0119  NV UP EL PL NZ NA PO NC
0B01:0119 00C7             ADD BH,AL
将BL中的数据与AH中的数据相加,结果放入AH中,CS:IP指向0B01:0119
-T
AX=2640  BX=4026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=011B  NV UP EL PL NZ NA PO NC
0B01:011B B400             MOV AH,00
将AL中的数据与BH中的数据相加,结果放入BH中,CS:IP指向0B01:011B
-T
AX=0040  BX=4026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=011D  NV UP EI PL NZ NA PO NC
0B01:011D 00D8             ADD AL,BL
将AH清零,CS:IP指向0B01:011D
-T
AX=0066  BX=4026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=011F  NV UP EI PL NZ NA PE NC
0B01:011F 049C             ADD AL,9C
将AL中的数据于BL中的数据相加,结果放入AL中,CS:IP指向0B01:011F
-T
AX=0002  BX=4026  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=0B01  IP=0121  NV UP EI PL NZ AC PO CY
0B01:0121 99               CWD
将AL中的数据加9CH,结果放入AL中,CS:IP指向0B01:0121

(2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
MOV AX,1
ADD AX,AX
JMP 2000:0003
做法:进入DEBUG,使用R命令修改CS为2000,修改IP为0,再使用A命令写入此3条指令。
-R CS
CS 0B01
:2000
-R IP
IP 0100
:0000
-A 2000:0000
2000:0000 MOV AX,1
2000:0000 ADD AX,AX
2000:0005 JMP 2000:0003
2000:0007
-T
AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=2000  IP=0003  NV UP EI PL NZ NA PO NC
2000:0003 01C0             ADD AX,AX
-T
AX=0002  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=2000  IP=0005  NV UP EI PL NZ NZ PO NC
2000:0005 EBFC             JMP 0003
-T
AX=0002  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B01  ES=0B01  SS=0B01  CS=2000  IP=0003  NV UP EI PL NZ NA PO NC
2000:0003 01C0             ADD AX,AX
ps:为早点睡觉,故以下只写有关的寄存器,节省时间
-T
AX=0004
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0004
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0008
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0008
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0010
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0010
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0020
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0020
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0040
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0040
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0080
IP=0005
2000:0005 EBFC             JMP 0003
-T
AX=0080
IP=0003
2000:0003 01C0             ADD AX,AX
-T
AX=0100
IP=0005
2000:0005 EBFC             JMP 0003
用计算器计算2的8次方为256,即16进制的100,故:完事了……

(3)查看内存中的内容
pc机主板上的ROM中写有一个生产日期,在内存FFF00H--FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
提示,如果读者对实验的结果感到疑惑,请仔细阅读第一章中的1.15节。
做法:进入DEBUG,使用"D FFF0:0000"命令查看内存中的内容,寻找日期字样的字符。若未发现,则再次使用D命令查看下一页。最终,我在FFF0:00F0一行的右侧发现了"09/02/02":
FFF0:00F0  EA 5B E0 00 F0 30 39 2F-30 32 2F 30 32 00 FC 88  .[...09/02/02...
估计我的主板是02年2月9号出厂的,古董了-_-|||
日期是从第6个字符开始的,加上反斜线共8个字符。于是,使用E命令改变它!
-E FFF0:00F6
FFF0:00F6  39.00  2F.00
FFF0:00F8  30.00  32.00  2F.00  30.00  32.00  00.00
我都改成0!使用D命令查看是否已经更改成功。
-D FFF0:00F0 00FF
FFF0:00F0  EA 5B E0 00 F0 30 39 2F-30 32 2F 30 32 00 FC 88  .[...09/02/02...
竟然没有改变,为什么呢,因为8086CPU从C0000H--FFFFFH之间的24K内存是各个ROM的空间,只可读,不可写。

(4)向内存从B8100H开始的单元中填写数据,如:
-E B810:0000 01 01 02 02 03 03 04 04
请读者先填写不同的数据,观察产生的现象;在改变填写的地址,观察发生的现象。
提示,如果读者对实验的结果感到疑惑,请仔细阅读第一章中的1.15节。
做法:那就试试吧!
-E 1000:0000 A B C D E F 0 1 2 3 4
-D 1000:0000 F
1000:0000  0A 0B 0C 0D 0E 0F 00 01-02 03 04 00 00 00 00 00  ................
-E 4000:0000 'A' 'C' G
                     ^ERROR
-E 4000:0000 'A' 'C'         ps:看来写入字符必须加上单引号,不知加双引号会怎样
-D 4000:0000 F
4000:0000  41 43 00 00 00 00 00 00-00 00 00 00 00 00 00 00  AC..............
-E 7000:0000 "H" "HELL000000000000000"
-D 7000:0000 F 
7000:0000  68 68 65 6C 6C 30 30 30-30 30 30 30 30 30 30 30  HHELL00000000000
PS:看来单引号和双引号一样的效果
-E 9000:0000 A B C 'A' 'B' 'C'
-D 9000:0000 F
9000:0000  0A 0B 0C 41 42 43 00 74-08 26 89 75 08 26 8C 5D  ...ABC.T.&.U.&.J
-E A000:0000 A B C 'A' 'B' 'C'
-D A000:0000 F
A000:0000  0A 0B 0C 41 42 43 00 00-00 00 00 00 00 00 00 00  ...ABC..........
PS:额,不是说8086cpuA0000H-BFFFFH的内存单元是显存吗,竟然没效果?哦,忘了,我的不是8086
-E CCCC:0000  A B C D 'A'
-D CCCC:0000 F
CCCC:0000  3D 24 42 43 24 0F 85 CC-00 0E 68 20 00 2E FF 36  =$BC$.....H ...6
PS:改不了
评论次数(3)  |  浏览次数(754)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码