|
主题 : : 实验四第三个上机试验根本行不通,我用我自己的方法来解决 [待解决] |
回复[ 41次 ]
点击[ 3374次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2007-10-26 00:30 ] | |
荣誉值:10
信誉值:6
注册日期:2007-10-20 14:34 |
mov ax, (这里很多人说填cx,但我根本就不懂填cx有什么意义)
这个代码的整体原理,从下面可以看清ES和[BX]用来指向00200H的地址了,也就是说现在的问题只是要代码可以将自己运行时,所使用的那个内存单元段保存起来,然后向这个单元段里逐个逐个字节的取出来,循环放到ES:[BX]上面
根据第四章来提到过的,一个EXE运行时必定要先载入到内存里,而DS寄存器里存放的就是当前EXE的文件头,前256个字节是用于DOS系统保留来干正事的,所以DS里存放的段地址,再往后偏移0010H就是指向EXE文件的第一条指令的内存地址,这样第一个问题“从哪里复制”就可以解决了,然后第二个问题是复制多少,第四章也说过CX存放的就是整个EXE文件里所有汇编指令的长度,所以循环的次数就是CX中的值,我修改后的代码长度为001FH,转成十进制就是31,就是循环31次。
我修改后的代码如下
assume cs:mycode
mycode segment
mov ax,ds
add ax,0010H
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,28
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
mycode ends
end
用T逐条运行之后,再拿00200H处的内存来比较,刚好修改到mov ax.4c00h的前一个单元,就跟问题的要求符合了! | | |
|
|
|
|
[第22楼] [ 回复时间:2008-05-15 15:43 ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-26 16:41 |
assume cs:codesg
codesg segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,cx
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end
我的程序如上,完全按书上敲下来的.
C:\ASM>debug lab43.exe
-r
AX=0000 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14FD ES=14FD SS=150D CS=150D IP=0000 NV UP EI PL NZ NA PO NC
150D:0000 8CC8 MOV AX,CS
-u
150D:0000 8CC8 MOV AX,CS
150D:0002 8ED8 MOV DS,AX
150D:0004 B82000 MOV AX,0020
150D:0007 8EC0 MOV ES,AX
150D:0009 BB0000 MOV BX,0000
150D:000C 8BC9 MOV CX,CX
150D:000E 8A07 MOV AL,[BX]
150D:0010 26 ES:
150D:0011 8807 MOV [BX],AL
150D:0013 43 INC BX
150D:0014 E2F8 LOOP 000E
150D:0016 B8004C MOV AX,4C00
150D:0019 CD21 INT 21
150D:001B 92 XCHG DX,AX
150D:001C 3E DS:
150D:001D 2B2EC706 SUB BP,[06C7]
-
可是DEBUG载入后CX=1B,即程序总长度为1B字节,减去mov ax,4c00h和int 21h两句话的5字节,应该是16H字节,为什么大家都得17H或18H字节呢?我得16H字节和大家的结果差了1字节,请问那区别在哪呢? | | |
|