我的第四个汇编实验报告
[SIZE="4"]实验4 [BX]和loop的使用
(1) 编程,向内存0:200~0:23F依次传送数据0~63(3FH).
;----------------------------------------------
;ex5-1.asm
;-----------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code ;;
code segment ;;
mov ax,20h ;;
mov ds,ax ;;
mov bx,0 ;;
mov ax,0 ;;
mov cx,0ffh ;;
s: mov [bx],ax ;;
inc bx ;;
inc ax ;;
loop s ;;
mov ax,4c00h ;;
int 21h ;;
code ends ;;
end ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“MOV AX,4C00H”和“INT 21H”。
;-------------------------------------------
;ex5-2.asm
;-------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code ;
code segment ;
mov ax,20h ;
mov ds,ax ;
mov bx,0 ;
mov cx,0ffh ;
s: mov [bx],bx ;
inc bx ;
loop s ;
mov ax,4c00h ;
int 21h ;
code ends ;
end ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(3) 下面的程序的功能是将“MOV AX,4C00H”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
;------------------------------------------------
;;ex5-3.asm
;------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code ;;;;;
code segment ;;;;;
mov ax,code ;;;;;
mov ds,ax ;;;;;
mov ax,0020h ;;;;;
mov es,ax ;;;;;
mov bx,0 ;;;;;
mov cx,18h ;;;;;
s:mov al,[bx] ;;;;;
mov es:[bx],al ;;;;;
inc bx ;;;;;
loop s ;;;;;
mov ax,4c00h ;;;;;
int 21h ;;;;;
code ends ;;;;;
end ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1.把EX5-3.EXE加载入内存中
$debug ex5-3.exe
-r
AX=0000 BX=0000 CX=001D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13C7 ES=13C7 SS=13D7 CS=13D7 IP=0000 NV UP EI PL NZ NA PO NC
13D7:0000 B8D713 MOV AX,13D7
-u
13D7:0000 B8D713 MOV AX,13D7
13D7:0003 8ED8 MOV DS,AX
13D7:0005 B82000 MOV AX,0020
13D7:0008 8EC0 MOV ES,AX
13D7:000A BB0000 MOV BX,0000
13D7:000D B91800 MOV CX,0018
13D7:0010 8A07 MOV AL,[BX]
13D7:0012 26 ES:
13D7:0013 8807 MOV [BX],AL
13D7:0015 43 INC BX
13D7:0016 E2F8 LOOP 21
13D7:0018 B8004C MOV AX,4C00
13D7:001D 00FF ADD BH,BH
13D7:001F 50 PUSH AX
2.把0:200的内容反汇编结果如下:
13D7:000D B91800 MOV CX,0018
13D7:0010 8A07 MOV AL,[BX]
13D7:0012 26 ES:
13D7:0013 8807 MOV [BX],AL
13D7:0015 43 INC BX
13D7:0016 E2F8 LOOP 0010
13D7:0018 B8004C MOV AX,4C00
13D7:001B CD21 INT 21
13D7:001D 00FF ADD BH,BH
13D7:001F 50 PUSH AX
-u 0:200
0000:0200 46 INC SI
0000:0201 07 POP ES
0000:0202 07 ADC [BP+SI],AL
0000:0204 0A04 OR AL,[SI]
0000:0206 1002 ADC [BP+SI],AL
0000:0208 3A00 CMP AL,[BX+SI]
0000:020A A30354 MOV [5403],AX
0000:020D 00A3036E ADD [BP+DI+6E03],AH
0000:0301 00A30388 ADD [BP+DI+8803],AH
0000:0305 00A303A2 ADD [BP+DI+A203],AH
0000:0309 00A303FF ADD [BP+DI+FF03],AH
0000:0303 0310 ADD DX,[BX+SI]
0000:030F 02A90810 ADD CH,[BX+DI+1008]
-
3.运行程序至正常结束
13D7:001D 00FF ADD BH,BH
13D7:001F 50 PUSH AX
-u 0:200
0000:0200 46 INC SI
0000:0201 07 POP ES
0000:0202 07 ADC [BP+SI],AL
0000:0204 0A04 OR AL,[SI]
0000:0206 1002 ADC [BP+SI],AL
0000:0208 3A00 CMP AL,[BX+SI]
0000:020A A30354 MOV [5403],AX
0000:020D 00A3036E ADD [BP+DI+6E03],AH
0000:0301 00A30388 ADD [BP+DI+8803],AH
0000:0305 00A303A2 ADD [BP+DI+A203],AH
0000:0309 00A303FF ADD [BP+DI+FF03],AH
0000:0303 0310 ADD DX,[BX+SI]
0000:030F 02A90810 ADD CH,[BX+DI+1008]
-g 1d
Program terminated normally
-
4.再次将0:200的内容反汇编结果如下:
0000:0301 00A30388 ADD [BP+DI+8803],AH
0000:0305 00A303A2 ADD [BP+DI+A203],AH
0000:0309 00A303FF ADD [BP+DI+FF03],AH
0000:0303 0310 ADD DX,[BX+SI]
0000:030F 02A90810 ADD CH,[BX+DI+1008]
-g 1d
Program terminated normally
-u 0:200
0000:0200 B8D713 MOV AX,13D7
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,[BX]
0000:0212 26 ES:
0000:0213 8807 MOV [BX],AL
0000:0215 41 INC BX
0000:0216 E2F8 LOOP 0210
0000:021B CD21 INT 21
0000:021D 0AC4 OR AL,AH
0000:021F 5E POP SI
对比图1和图4,我们可以看出mov ax,4c00h前的指令序列已经被复制到了0:200处
实验总结:经过这次实验,我掌握了如何将一段内存的数据复制到另一段内存中去,以及如何将程序自身的指令序列复制到另一段内存中去.掌握了如何优化程序来将内存的内容复制到另一段内存去。
这次实验,花费我大量的时间和心血,终于完成了。
