. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验四----看清DEBUG程序如何让被调试程序一条一条执行  [待解决] 回复[ 4次 ]   点击[ 464次 ]  
liuquanhao7232
[帖 主]   [ 发表时间:2012-07-10 01:08 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2010-07-12 08:47
assume cs:code
code segment

mov ax,cs   ;给cs

mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0

mov cx,cx  ;给cx,cx默认时整个程序的长度

s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h

code ends
end

这个程序原意应该是把自己整个程序都复制到0:200h里面。包括mov ax,4c00h   int 21h  。



源程序,详细看0B4D:0014~0B4D:0019的机器码。
-r
AX=0000  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B3D  ES=0B3D  SS=0B4D  CS=0B4D  IP=0000   NV UP EI PL NZ NA PO NC
0B4D:0000 8CC8          MOV     AX,CS
-u
0B4D:0000 8CC8          MOV     AX,CS
0B4D:0002 8ED8          MOV     DS,AX
0B4D:0004 B82000        MOV     AX,0020
0B4D:0007 8EC0          MOV     ES,AX
0B4D:0009 BB0000        MOV     BX,0000
0B4D:000C 8BC9          MOV     CX,CX
0B4D:000E 8A07          MOV     AL,[BX]
0B4D:0010 26            ES:
0B4D:0011 8807          MOV     [BX],AL
0B4D:0013 43            INC     BX
0B4D:0014 E2F8          LOOP    000E
0B4D:0016 B8004C        MOV     AX,4C00
0B4D:0019 CD21          INT     21

下面时程序运行到mov ax,4c00h时0:200的指令。仔细看0:0216 ~021A 的机器码。
AX=0021  BX=001B  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B4D  ES=0020  SS=0B4D  CS=0B4D  IP=0016   NV UP EI PL NZ NA PE NC
0B4D:0016 B8004C        MOV     AX,4C00
-u 0:200
0000:0200 8CC8          MOV     AX,CS
0000:0202 8ED8          MOV     DS,AX
0000:0204 B82000        MOV     AX,0020
0000:0207 8EC0          MOV     ES,AX
0000:0209 BB0000        MOV     BX,0000
0000:020C 8BC9          MOV     CX,CX
0000:020E 8A07          MOV     AL,[BX]
0000:0210 26            ES:
0000:0211 8807          MOV     [BX],AL
0000:0213 43            INC     BX
0000:0214 E2F8          LOOP    020E
0000:0216 CC            INT     3
0000:0217 004CCD        ADD     [SI-33],CL
0000:021A 2100          AND     [BX+SI],AX

;以下是原来就有的数据。我全部给的0(看机器码)。
0000:021C 0000          ADD     [BX+SI],AL
0000:021E 0000          ADD     [BX+SI],AL

2个程序的不同点:
源程序:
0B4D:0014 E2F8          LOOP    000E
0B4D:0016 B8004C        MOV     AX,4C00
0B4D:0019 CD21          INT     21
目的程序:
0000:0214 E2F8          LOOP    020E
0000:0216 CC            INT     3
0000:0217 004CCD        ADD     [SI-33],CL
0000:021A 2100          AND     [BX+SI],AX  ;这里2100后面的00时我原本给的0,不是复制过来的。


在loop s指令上时我用的p命令以运行到mov ax,4c00h处。程序运行到mov ax,4c00h时,程序居然给了条Int 3中断。
不知不觉中,debug没有把整个程序按原样复制到0:200,而是在loop s(loop 020E)后面把B8004C(mov ax,4c00h)中的B8换成了CC(INT 3)然后再复制的。

根据以上,我这样猜想。
在loop s上时,当我执行p命令后,P命令用CC(int 3)替换掉后面一条指令的第一字节。然后运行loop循环直到loop结束(这时IP为mov ax,4c00h的地址),因为loop后面是Int 3.所以程序会暂停在这里。这时,P命令在把原来的机器码B8(mov ax,4c00h的一部分)再换回来。所以我们就看到P命令执行后暂停在了mov ax,4c00h而没有看到int 3.

但为什么0:200有Int 3呢?看上面的分析,P命令是在LOOP结束时才把int 3换走,此时loop已经把最后的int 21h复制到了0:200处了,复制的程序里面就有被替换的int 3指令。从这里可以看到既然P命令是用int 3,那t命令自然也是用的int 3才能让程序能运行一条就暂停。

而王爽之所以出题说不要将mov ax,4c00h及后面的程序复制过去。或许原因之一就时因为后面跟本就没有mov ax,4c00h,而只有一条int 3后2条奇怪的代码。
fpamc
[第1楼]   [ 回复时间:2012-07-10 07:19 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
这个程序原意应该是把自己整个程序都复制到0:200h里面。包括mov ax,4c00h   int 21h  。 

这句话的理解是错误的。。

题目原意是,
向内存0:200~0:23f 送入数据0~3fh

功能的实现只能用9条指令。(mov ax,4c00h  int 21h算2条指令。)
不是说将程序送入0:200~0:23f
ancienthuman
[第2楼]   [ 回复时间:2012-07-18 15:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-07-15 10:30
楼上理解错题了吧······
fpamc
[第3楼]   [ 回复时间:2012-07-19 07:21 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
回复:[第2楼]
------------------
求指教。
hades
[第4楼]   [ 回复时间:2012-08-28 02:24 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2012-08-22 18:48
第二题降到7条指令:
只用改一下DS段地址为0020H即可将一个变量重复使用,既作为便宜地址的递增,也可以作为向偏移地址赋值的内容,不用再重设一个变量。
     mov ax,0020h
     mov ds,ax
     mov bl,0
     mov cx,64
xx:  mov [bl],bl
     inc bl
     loop xx
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved