. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
主题 : :  实验四第三个上机试验根本行不通,我用我自己的方法来解决  [待解决] 回复[ 41次 ]   点击[ 3374次 ]  
helloworld
[帖 主] [ 发表时间: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的前一个单元,就跟问题的要求符合了!
leefox
[第24楼] [ 回复时间:2008-05-25 09:40 ] 
荣誉值:0
信誉值:0
注册日期:2008-01-21 11:43
此题有多个答案,但最终解答离不开shanguianti 的意见:“mov用在寄存器之间传送数据的指令是2个字节,用在寄存器和立即数之间是3个字节,用在寄存器和ES:[BX]这之间是3个字节。inc指令占用一个字节,loop s占用两个字节” 

答案1:mov ax,cs  (占2个字节) 
     mov cx,17
答案2:mov ax,code (占3个字节)
     mov cx,18
答案3:mov ax,cs 或mov ax,code
   把mov cx,   改成 sub cx,5(因为在载入程序时,cx保存程序的长度,减去5是为减去mov ax,4c00h和
                                 int 21h的长度)
总结:
此题王爽老师的目的是:
1、理解CS和CODE的关联
2、CS保存程序的代码段,即“复制的是什么,从哪里到哪里”
3、熟记某些指令的长度,即“复制的是什么,有多少个字节”,具体参考shanguianti 的意见。
4、理解CX在载入程序后保存程序的长度。
5、理解数据和代码对CPU来说是没区别的,只要CS:IP指向的就是代码
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved