500年前 发表于 2011-12-25 22:23:31

实验4.3

(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
   mov ax,code;code为所填写的数据
   mov ds,ax
   mov ax,0020h
   mov es,ax

   mov bx,0
   mov cx,18h   ;18h为所填写的数据
s:   mov al,
   mov es:,al
   inc bx
   loop s

   mov ax,4c00h
   int 21h
code ends
end

问题:老实说 我到现在都没有看明白 题目是什么意思?所以更不明白答案?:'(:'(:'(:'(

zzmatrix 发表于 2011-12-26 10:57:39

实验4 和loop的使用

(3)下面的程序功能是将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code   

code segment   

   mov ax, code ;或mov ax, cs

   mov ds,ax   

   mov ax,0020h   

   mov es,ax   

   mov bx,0   

   mov cx, 18h   ;或mov cx, 17h    ;或sub cx,5

s: mov al,   

   mov es:,al   

   inc bx   

   loop s   

   mov ax,4c00h   

   int 21h   

code ends   

end



此题有多个答案,因为mov用在寄存器之间传送数据的指令是2个字节,用在寄存器和立即数之间是3个字节

答案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、理解CX在载入程序后保存程序的长度。

4、理解数据和代码对CPU来说是没区别的,只要CS:IP指向的就是代码



C:\DOCUME~1\ADMINI~1>debug sy4-3.exe

-u

0C79:0000 B8790C      MOV   AX,0C79

0C79:0003 8ED8          MOV   DS,AX

0C79:0005 B82000      MOV   AX,0020

0C79:0008 8EC0          MOV   ES,AX

0C79:000A BB0000      MOV   BX,0000

0C79:000D B91800      MOV   CX,0018

0C79:0010 8A07          MOV   AL,

0C79:0012 26            ES:

0C79:0013 8807          MOV   ,AL

0C79:0015 43            INC   BX

0C79:0016 E2F8          LOOP    0010

0C79:0018 B8004C      MOV   AX,4C00

0C79:001B CD21          INT   21

0C79:001D 50            PUSH    AX

0C79:001E 8D4680      LEA   AX,

-g

Program terminated normally

-d 0:200

0000:0200B8 79 0C 8E D8 B8 20 00-8E C0 BB 00 00 B9 18 00   .y.... .........

0000:02108A 07 26 88 07 43 E2 F8-00 00 00 00 00 00 00 00   ..&..C..........

0000:022000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0000:023000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0000:024000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0000:025000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0000:026000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0000:027000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-u 0:200

0000:0200 B8790C      MOV   AX,0C79

0000:0203 8ED8          MOV   DS,AX

0000:0205 B82000      MOV   AX,0020

0000:0208 8EC0          MOV   ES,AX

0000:020A BB0000      MOV   BX,0000

0000:020D B91800      MOV   CX,0018

0000:0210 8A07          MOV   AL,

0000:0212 26            ES:

0000:0213 8807          MOV   ,AL

0000:0215 43            INC   BX

0000:0216 E2F8          LOOP    0210

0000:0218 0000          ADD   ,AL

0000:021A 0000          ADD   ,AL

0000:021C 0000          ADD   ,AL

0000:021E 0000          ADD   ,AL

-q

@景天@ 发表于 2011-12-26 12:24:50

你题目里所说的
mov cx,18h   ;18h为所填写的数据
这个18其实就是前面所有指令所占的字节数,至于为什么是18h,其实得先把汇编指令转换为机器码,然后就知道它们有多大了,这个过程可以先用debug调试一遍就知道了,呵呵
页: [1]
查看完整版本: 实验4.3