实验1 用机器指令和汇编指令编程

一、实验结论
    1. 实验1
    (1)实验任务1
             使用Debug,将教材中程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化
               
机器码        汇编指令
b8 20 4e    mov ax,4E20H
05 16 14    add ax,1416H
bb 00 20    mov bx,2000H
01 d8        add ax,bx
89 c3        mov bx,ax
01 d8        add ax,bx
b8 1a 00    mov ax,001AH
bb 26 00    mov bx,0026H
00 d8        add al,bl
00 dc        add ah,bl
00 c7        add bh,al
b4 00        mov ah,0
00 d8        add al,bl
04 9c        add al,9CH
             用r指令可查看当前寄存器内容,如图所示:
             
 
 
             第一种方法:使用e命令写入内存,同时用使用t命令单步调试,如图所示:
             

             

 

              第二种方法:使用a命令写入内存,同时用使用t命令单步调试,如图所示:

              

              

             分析可知:每执行一次t命令,CS不变,IP增加3.

   

      (2)实验任务2

       将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方

mov ax,1
add ax,ax
jmp 2000:0003

          用a命令写入指令,如图所示:

          

          因为如果要执行2000:0开始的内存单元,必须要修改CS:IP,则如图所示:

          

 

          随后用t指令不断进行单步调试:

         

        

         

         

 

         循环执行八次后可知,AX=0100H=256(10) 即2^8。

         分析:AX作为累加单元,初始值为0001。

                  JMP为立即数,表示将立即数转移到IP中,执行结果中CS:IP不断跳回2000:0003,起循环作用。

(3)实验任务3

          查看内存中的内容,PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

         用d命令查看内存FFF00H~FFFFFH内容,如图所示:

        

        可得生产日期为1992年1月1日。

        试图修改内容后,发现失败,可得其地址为该地址为ROM地址空间(只读)

        

       分析:地址C0000~FFFFF的内存单元为各类ROM地址空间。

 (4)实验任务4

      向内存从B8100H开始的单元中填写数据,例如:

        

        可得:

        输入:

        可得:

        输入:

        可得:

 

        分析:8086中A0000~BFFFF为显存地址空间,在B8100H开始的单元中填写数据会被读取并解析为对应的屏幕信息并显示。

 

    2. 实验2

         (1)实验任务1

                使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

mov ax,ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]     ;ax=_____
add ax,[2]     ;ax=_____
mov bx,[4]     ;bx=_____
add bx,[6]     ;bx=_____

push ax        ;sp=_____ ; 修改的内存单元的地址是_____内容为_____
push bx        ;sp=_____ ; 修改的内存单元的地址是_____内容为_____
pop ax         ;sp=_____ ; ax=_____
pop bx         ;sp=_____ ; bx=_____

push [4]       ;sp=_____ ; 修改的内存单元的地址是_____内容为_____
push [6]       ;sp=_____ ; 修改的内存单元的地址是_____内容为_____

 

                     为了便于验证实验结果,做如下两点调整:
                         ① 在使用 命令输入指令调试之前,先使用 命令将内存单元 0022:0 ~0022:7连续 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
                         ② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022 

 

                     使用e命令修改内存单元0022:0~0022:7的数据,并用a命令输入指令:

                     

                   指令单步调试:

                   

                  

                  

 

                 填空结果为如图所示,与预估结果相符。:

mov ax,[0]     ;ax=5150H
add ax,[2]     ;ax=A4A2H
mov bx,[4]     ;bx=5554H
add bx,[6]     ;bx=ACAAH

push ax        ;sp=00FEH ; 修改的内存单元的地址是2200:00FE内容为A4A2H
push bx        ;sp=00FCH ; 修改的内存单元的地址是2200:00FC内容为ACAAH
pop ax         ;sp=PPFEH ; ax=ACAAH
pop bx         ;sp=00FCH ; bx=A4A2H

push [4]       ;sp=00FEH ; 修改的内存单元的地址是2200:00FE内容为5554H
push [6]       ;sp=00FCH ; 修改的内存单元的地址是2200:00FC内容为5756H

                    

            (2)实验任务2

            仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

                使用 a命令输入指令,使用 e 命令修改2000:0~2000:f 的值:

               

 

               用t命令单步调试:

              

 

 

              

               

              1.将2000H放入AX寄存器
              2.用AX寄存器的值放入段寄存器SS
              3.将10H放入寄存器SP

              注意:mov ss,ax和mov sp,0100一起执行。

 

二、实验总结

        1.用jmp指令可以起到循环效果。

              2.使用t命令可以更好地了解指令运行情况

 

 

posted @ 2020-10-15 22:14  浔川Dawn  阅读(193)  评论(2)    收藏  举报