(1)读取CMOS RAM的2号单元的内容。
首先在debug中用a命令将指令写入内存,用t命令执行。
D:\masm>debug
-a
0B00:0100 mov al,2
0B00:0102 out 70,al
0B00:0104 in al,71
0B00:0106
-t
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B00 ES=0B00 SS=0B00 CS=0B00 IP=0102 NV UP EI PL NZ NA PO NC
0B00:0102 E670 OUT 70,AL
-t
AX=0047 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=0B00 ES=0B00 SS=0B00 CS=0B00 IP=0107 NV UP EI PL NZ NA PO NC
0B00:0107 8946F8 MOV [BP-08],AX SS:FFF8=0012
-q
执行out指令之后,ip就变成0107了,有指令连续执行,看不到结果。
再编写成程序如下:
assume cs:code
code segment
start: mov al,2
out 70h,al
in al,71h
mov ax,4c00h
int 21h
code ends
end start
汇编连接之后,用debug调试。
D:\masm>debug ce14_1.exe
-u0 9
0B60:0000 B002 MOV AL,02
0B60:0002 E670 OUT 70,AL
0B60:0004 E471 IN AL,71
0B60:0006 B8004C MOV AX,4C00
0B60:0009 CD21 INT 21
-t
AX=0002 BX=0000 CX=000B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0002 NV UP EI PL NZ NA PO NC
0B60:0002 E670 OUT 70,AL
-t
AX=4C00 BX=0000 CX=000B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0009 NV UP EI PL NZ NA PO NC
0B60:0009 CD21 INT 21
-q
指令连续执行了,看不到结果。
于是在mov ax,4c00h之前加上一条nop指令:
D:\masm>debug ce14_1.exe
-u0 a
0B60:0000 B002 MOV AL,02
0B60:0002 E670 OUT 70,AL
0B60:0004 E471 IN AL,71
0B60:0006 90 NOP
0B60:0007 B8004C MOV AX,4C00
0B60:000A CD21 INT 21
-t
AX=0002 BX=0000 CX=000C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0002 NV UP EI PL NZ NA PO NC
0B60:0002 E670 OUT 70,AL
-t
AX=0049 BX=0000 CX=000C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0007 NV UP EI PL NZ NA PO NC
0B60:0007 B8004C MOV AX,4C00
-q
这下能看到了,al=49h。看看屏幕右下角的时钟,刚好是14:49。
(2)编程,向CMOS RAM的2号单元写入0。
程序如下:
assume cs:code
code segment
start: mov al,2
out 70h,al
mov al,0
out 71h,al
mov ax,4c00h
int 21h
code ends
end start
汇编连接运行之后,屏幕右下角时钟没有变化。不知道是不是写进去了。于是增加了修改al,从71h中读出的指令,发现果然是修改过了。可是为什么时钟没有变化呢?
D:\masm>debug ce14_2.exe
-u 0 10
0B60:0000 B002 MOV AL,02
0B60:0002 E670 OUT 70,AL
0B60:0004 B000 MOV AL,00
0B60:0006 E671 OUT 71,AL
0B60:0008 B005 MOV AL,05
0B60:000A E471 IN AL,71
0B60:000C 90 NOP
0B60:000D B8004C MOV AX,4C00
0B60:0010 CD21 INT 21
-t
AX=0002 BX=0000 CX=0012 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0002 NV UP EI PL NZ NA PO NC
0B60:0002 E670 OUT 70,AL
-t
AX=0000 BX=0000 CX=0012 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=0006 NV UP EI PL NZ NA PO NC
0B60:0006 E671 OUT 71,AL
-t
AX=0005 BX=0000 CX=0012 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=000A NV UP EI PL NZ NA PO NC
0B60:000A E471 IN AL,71
-t
AX=0000 BX=0000 CX=0012 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B50 ES=0B50 SS=0B60 CS=0B60 IP=000D NV UP EI PL NZ NA PO NC
0B60:000D B8004C MOV AX,4C00
-q
D:\masm>
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50