zoukankan      html  css  js  c++  java
  • 汇编语言实验一

    本次实验中需要用到的命令:

    • - R:查看和修改 CPU 中寄存器的内容
    • - D:查看内存中的内容
    • - E:修改内存中的内容(可以写入数据或者指令,在内存中,它们实际上没有区别)
    • - U:将内存单元中的内容翻译为机器指令和汇编指令
    • - T:执行 CS:IP 指向的内存单元处的指令
    • - A:以汇编指令的形式向内存中写入指令

     实验任务:

    (一)使用 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

    可以使用 E 命令或者 A 命令向内存中写入指令。注意用 T 命令执行的时候, CS:IP 的指向。

    其中 E 命令是写入机器码,A 命令写入汇编指令。

    上面总共有 14 条指令,其中前 7 条指令我使用 E 命令写入内存,后 7 条指令使用 A 命令写入内存。

    下面是动图演示向内存中输入指令的过程:

    可以看到我在使用汇编指令的方式输入的时候,第一条指令输入 mov bx,0026H 报错了,是因为向 8086PC 机内存输入指令的时候,默认使用的是 16 进制,所以不需要在指令中指明。

    下面动图演示使用 T 命令执行上述写入的各条指令,注意内存中寄存器的内容变化,特别是 CS 和 IP 的内容是如何变化的。

    可是看到为了执行我们输入内存中的指令,首先我将 CS 的值置为 1000H,然后将 IP 的值置为 0000H,这下 CPU 接下来执行的第一条指令就是从内存单元的 1000:0 开始。

    然后我使用了 14 个 T 命令,完成了指令的执行,在执行过程中可以仔细注意各个相关寄存器内容的变化。

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

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

     将指令写入内存后,执行 T 命令,直到 AX 中的值为 0100H。

    动图演示如下:

    首先写入指令后,照样是将 CS:IP 的值设置为 2000:0,即第一条需要执行的指令地址。

    然后输入 T 指令执行,这道题使用了 jmp 这条汇编指令,例如 jmp 2000:0003 即是将 CS 中的值置为 2000H ,IP 中的值置为 0003H。

    这样我们在指令执行的过程中没有去主动的修改过 CS:IP 的值,而是通过内存单元中的一条指令来完成的。

    (三)查看内存的内容

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

    使用 D 命令去内存中的相关区域查看,动图演示如下:

    首先用 D 命令查看了这段生产日期为 06 / 23 / 99 且内存地址单元为 ffff:5 ~ ffff:c

    然后我使用 E 命令向该段内存中写入 8 个字节,试图修改这段内存的内容。

    点击确认后再次查看该段内存的内容还是没变,说明了ROM 中的内容是不可改变的

    下面是 8086PC 机内存地址空间分配情况:

    (四)向内存从 B8100H 开始的单元中填写数据

    如:B810:0000 01 01 02 02 03 03 04 04 

    请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

    动图演示如下:

    明显观察到图中右上方出现了变化,当输入不同数据时,出现的图形和颜色也不同。

    这说明了上面那个内存起始地址是处于显存的范围,向里面写入数据其实是在向显存中写入数据,显卡再将显存中的数据输出到屏幕上。

    (完)

  • 相关阅读:
    时序数据库入门
    MySQL执行计划extra中的using index 和 using where using index 的区别
    ETL的详细解释定义
    六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate)
    使用 IntraWeb (37)
    使用 IntraWeb (36)
    使用 IntraWeb (35)
    使用 IntraWeb (34)
    使用 IntraWeb (33)
    使用 IntraWeb (32)
  • 原文地址:https://www.cnblogs.com/KKSJS/p/9942050.html
Copyright © 2011-2022 走看看