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。