实验四

 
 实验内容1
(1)源代码
assume cs:code
code segment
   mov bx,07b8h
   mov ax,0b800h
   mov ds,ax
 
   mov cx,16
 
   mov ax,0403h
s:     mov [bx],ax
   add bx,2
   loop s
 
   mov ah,4ch
   int 21h
code ends
end
 

(2)将源代码程序中字数据0403H→修改为0441H,再次运行,截图显示运行结果。

 

实验内容2(必做部分)

(1)

 1 assume cs:code
 2 code segment
 3      mov ax,0
 4      mov ds,ax
 5  
 6      mov cx,40h
 7  
 8      mov bx,200h
 9      mov al,0
10 s:  mov [bx],al
11      add al,1
12      add bx,1
13      loop s
14  
15      mov ah,4ch
16      int 21h
17 code ends
18 end

(2)汇编、链接无误后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令 查看0:200~0:23F,确认是否将0~63传送至此段内存区域。这部分,要求有截图。 (选做部分,如完成,也按上述要求在博客文档中撰写相应内容)
 

 

以下笔者检验一下

正确,故一下用g命令结束它。

 结果检验:

 选做部分

assume cs:code
code segment
    mov ax,20h
    mov ss,ax
    
    mov ah,40h
    mov cx,40h
    
s:  mov sp,cx
    sub ah,1
    push ax
    loop s
    
    
    mov ax,0 ;这部分是为了修改0:200的内容为0,上面的循环不能修改该位置。
    mov ds,ax
    mov bx,1ffh
    mov [bx],ax
    
    mov ah,4ch
    int 21h
code ends
end

调试观察运行

 

 

可见内存的修改过程。

下面直接运行,可见结果。

 

实验内容3

 1 assume cs:code
 2 code segment
 3    mov ax,cs;为了把指令写入,故段地址必须为cs的值;2字节
 4    mov ds,ax;
 5    mov ax,0020h;
 6    mov es,ax;
 7    mov bx,0;
 8    mov cx,17h;
 9 s:   mov al,[bx]
10    mov es:[bx],al
11    inc bx
12    loop s
13    mov ax,4c00h
14    int 21h
15 code ends
16 end

由截图可知mov ax,4c00h在0770:0017h从0000h-0017h(左闭右开)共17h个内存单元故需要17h此循环(即cx=17h)

(刚开始可以随便赋值一个cx,然后反汇编,由于笔者截图时已经找到了cx,应该为17h故图中cx赋值为17h)

(当然,我们假定如果cx的赋值语句不影响语句长度(即循环次数)。)

以下调试观察执行过程

可以观察到循环,下面我们结束运行

 

对比本实验的第一个结果,我们发现,我们非常完美地得到了结果。

总结与体会

通过这次实验,我练习使用了cx,[bx],loop这些指令的使用

CX 是计数寄存器 (count register)  (在这里找到的https://www.cnblogs.com/jordangong/p/9785544.html)

所以cx的值就是循环次数。

loop的指令形式有点向C语言里面的goto用法。

第二个实验还练习了,栈的使用,

其中mov [内存单元],ax还有一些问题(不能通过编译)。

故直接用了mov [bx],ax的方法。

第三题比较简单,假设后直接反汇编。

从网上查得,8086CPU中,指令的字节大小是不定的,在1-6之间,多为2,3。

原文地址:https://www.cnblogs.com/asm085/p/9954740.html