标签:data- 次数 lin font 执行 程序 递增 end bug
1 ;ex1.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 mov byte ptr ds:[0], 1 7 mov byte ptr ds:[1], 1 8 mov byte ptr ds:[2], 2 9 mov byte ptr ds:[3], 2 10 mov byte ptr ds:[4], 3 11 mov byte ptr ds:[5], 3 12 mov byte ptr ds:[6], 4 13 mov byte ptr ds:[7], 4 14 15 mov ah, 4ch 16 int 21h 17 code ends 18 end
汇编:
链接:
运行:
使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节:
结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编:
使用g命令执行到line16退出执行之前:
1 ; ex2.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 7 mov bx, 0 8 mov ax, 101H 9 mov cx, 8 10 s: mov [bx], ax 11 add bx, 2 12 add ax, 101H 13 loop s 14 15 mov ah, 4ch 16 int 21h 17 code ends 18 end
汇编:
链接:
运行:
结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编:
使用t命令对ex2.exe进行调试:
使用p命令调试:
可见,p命令可以跳过loop循环
使用g命令调试:
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8
汇编:
链接:
运行:
?结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效 果?在具体实现上有什么不同?
??他们实现了相同的功能和效果,但是在具体实现上不同。ex1.asm是通过byte的形式,使用ptr指针,将数据移到对应的字节地址,而ex2.asm是通过循环递增ax,再移入bx。
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。
汇编源代码:
1 assume cs:code 2 code segment 3 mov ax,0b800h 4 mov ds,ax 5 mov bx,07b8h 6 mov ax,0437h 7 mov cx,16 8 s: mov [bx],al 9 inc bx 10 mov [bx],ah 11 inc bx 12 loop s 13 14 mov ax,4c00h 15 int 21h 16 code ends 17 end
运行结果:
把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果:
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果:
?猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
??高位字节里存放的是颜色信息,低位字节里存放的是字形信息。
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
由0~63可知是64字节型数据
1 assume cs:code 2 code segment 3 mov ax,20h 4 mov es,ax 5 6 mov cx,64 7 mov bx,0 8 mov dl,0 9 10 s: mov es:[bx],dl 11 inc bx 12 inc dl 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
调试,并使用d命令查看0:200~0:23F:
简单调试一下,可以发现,是在复制数据的
使用p命令跳过循环,查看结果:
由结果可知,确认已经将0-3F传送至此段内存区域。
下面的程序的功能是将“mov ax,4C00H”之前的指令复制到内存 0:200处,补全程序。
ds确定数据从何处来,cx是复制多少个字节。al是8位寄存器,
1 assume cs:code 2 code segment 3 mov ax,cs 4 mov ds,ax 5 mov ax,0020h 6 mov es,ax 7 mov bx,0 8 mov cx,23 9 10 s: mov al,[bx] 11 mov es:[bx],al 12 inc bx 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
进行反汇编,17H-0=23
调试:
第一个字节是8C,所以al第一个得到的是8C。
用d命令查看0:200之后的若干字节:
观察到已经将mov ax, 4c00h之前的指令复制到指定内存
?以文字方式说明空白处填写依据。
??第一空,cs指令指向反汇编的命令,所以应该填cs。第二空,IP=IP+所读指令的字节数,可以将中间的当作一条指令。首先用u命令反汇编,发现mov ax 4c00位于0017h,0017h-0=17h=23,得到23。
实验总结
?字母型数据前面要加一个0,eg:mov ax,0B800H,这是翻译软件的规则。
?;用作注释
?LOOP指令,是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指版令在循环体之后权,至少执行1次循环体,即至少循环1次。执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。
?bx中存储的值为一个偏移地址,该指令是将bx中存储的数据段偏移地址所对应的存储器中的值传送给寄存器。
标签:data- 次数 lin font 执行 程序 递增 end bug
原文地址:https://www.cnblogs.com/xxzkyl/p/13909099.html