. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验四(3题)求新的解法  [已解决] 回复[ 7次 ]   点击[ 1228次 ]  
mouse
[帖 主]   [ 发表时间:2007-11-26 21:02 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
第三题,填空 
assume cs:code  
code segment  
    mov ax,cs   ;ax,填空  
    mov ds,ax  
    mov ax,0020h  
    mov es,ax  
    mov bx,0  
    mov cx,17h     ;cx,填空 
s:     
    mov al,[bx]  
    mov es:[bx],al  
    inc bx  
    loop s  

    mov ax,4c00h  
    int 21h  
code ends  
end  

由于要将当前代码复制到0:200处,所以要得到当前代码载入后的地址,由于程序载入的地址于系统环境有关,是一个不定值,则第一个空肯定填写cs,cs即代码段载入内存的段地址,第一条指令的偏移为0。 

测试时候讲cx设置为零,debug加载(下图) 
由图可知:CX=001C  --0B49:001C  CC  INT 3即int 21的下一条指令. 
根据题意,赋值mov ax,4c00h前的代码, 
0B49:0017 B8004C        MOV     AX,4C00 
也就是说赋值0B49:000~0B49:0016的代码,即cx=17h 

试验结果: 
-u 
0B49:0000 8CC8          MOV     AX,CS 
0B49:0002 8ED8          MOV     DS,AX 
0B49:0004 B82000        MOV     AX,0020 
0B49:0007 8EC0          MOV     ES,AX 
0B49:0009 BB0000        MOV     BX,0000 
0B49:000C B91900        MOV     CX,0000 
0B49:000F 8A07          MOV     AL,[BX] 
0B49:0011 26            ES: 
0B49:0012 8807          MOV     [BX],AL 
0B49:0014 43            INC     BX 
0B49:0015 E2F8          LOOP    000F 
0B49:0017 B8004C        MOV     AX,4C00 
0B49:001A CD21          INT     21 
0B49:001C CC            INT     3 
0B49:001D 50            PUSH    AX 
0B49:001E E8B760        CALL    60D8 
-r 
AX=0000  BX=0000  CX=001C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000 
DS=0B39  ES=0B39  SS=0B49  CS=0B49  IP=0000   NV UP EI PL NZ NA PO NC 
0B49:0000 8CC8          MOV     AX,CS
mouse
[第1楼]   [ 回复时间:2007-11-26 21:03 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
这是我打消掉数每条指令的长度求和后的最新方法,不知道还有没有新的解法??
nnyj
[第2楼]   [ 回复时间:2007-11-27 08:55 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2007-11-17 09:50
我的做法:
第一个空处填写code,使用符号地址来表示CS的段地址。
第二个空处先随便填写一个数字,用DEBUG调入,CX的值1DH即为代码段的长度,减去mov ax,4c00h  int 21h这两个指令共5个指节的长度,得到18H,即为要复制的字节的数量
mouse
[第3楼]   [ 回复时间:2007-11-27 15:18 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
谢谢楼上,原来第一个空还可以填写code,我光想cs,ds了~
第二个空和我的方法差不多。再次谢谢楼上。

还有别的方法和答案吗?
philmei
[第4楼]   [ 回复时间:2007-11-28 23:58 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
可是做到这时code可以用做指令还没学
我支持mouse的解法
我开始做时,cs那个空是想到了,第2问想不出来,但我知道用debug后肯定能算出长度,当时觉得既然是题目,就不能玩阴招,就没用debug,后来实在不行一看答案,靠
mouse
[第5楼]   [ 回复时间:2007-12-12 12:00 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
呵呵
谢谢楼上
492668570
[第6楼]   [ 回复时间:2007-12-12 15:57 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:1
注册日期:2007-12-02 21:14
code在这做为标号,在第四章第二节中讲到了,应该是学了,但这里code被编译器编译为段地址,在 loop s 中 s 被编译我编译为偏移地址。
mouse
[第7楼]   [ 回复时间:2008-03-28 09:29 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
此贴由 贴主 于 [ 2008-03-28 09:29 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(nnyj):6分   4楼(philmei):3分   6楼(492668570):3分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved