• Assembly实验一


    1、使用debug语句输入程序并逐条执行。

    注意此处输入机器码时用命令e,而输入汇编指令时用命令a,此二者可由反汇编u查看到彼此。此题比较简单,直接上图。

    (输入代码并由-t单步逐条执行)

    (对汇编指令反汇编查看机器码)

    (对机器码反汇编查看汇编指令)

    2、将三条指令从指定内存单元输入并计算2的8次方。

    三条指令为:

    mov ax,1

    add ax,ax

    jmp 2000:0003

    由-a将它们以此输入,并用-r查看与修改cs、ip指针,为下一步语句的执行做准备。具体操作如下图所示:

    我注意到第2、3条语句每执行一边相当于是乘了一次2,而要求2的8次方便相当于是让它们执行8次,也就是说一共执行17条语句(别忘了第一次还要执行第一条语句)。由于这三条语句是一个不会自己终止的循环,所以g指令在此不适用,而应当选用-t加上所要执行的语句条数。

    一开始,我错误地输入了-t 17

    结果如下图:

    我发现原本应为0100的ax被多乘了四次2,原来,在dosbox中默认采用16进制输入,所以此处想要执行十进制中的17条语句便应当输入十六进制中的11.

    改变写法后,正确结果如下:

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

    本题可通过d 段地址:偏移地址1 偏移地址2(或用l+数字表示的长度)来查看从【段地址:偏移地址1】表示的内存开始到偏移地址2的内容

    输入-d f000:ff00 ffff后结果如下图:

    可知题中提到的生产日期为1992.1.1,且该日期存在内存单元FFFF0H中。

    用e命令试图改变它的值,多次尝试失败,放弃挣扎,结果如下图:

    后来再仔细一看题目,原来这是一个ROM(只读存储器),我内心........

    不过在试图改变这个值的过程中我熟练掌握了指令e的各种用法,记录如下:

    e :用于改写内存中内容

    用法1:

    写法:-e 段地址:偏移地址 要改写的内容

    用途:从所写地址开始改写内存中的内容

    用法2:

    写法:-e  ‘字符’  ……

    用途:从当前cs:ip地址开始改写内存中的内容,并将字符以ASCLL码的形式存入内存单元中

    用法3:

    写法:-e 段地址:偏移地址

    用法:从所写地址开始逐个改写内存中的内容,按下回车后地址中的远值会自动出现,在原值后输入想要改写的数即可。按空格进入下一个值的修改。若不想修改该值,则直接按空格跳过。修改结束按回车。

    4、向内存B8100H开始的单元中填写数据,然后分别改编填写的数据和填写的地址,观察产生的现象。


    话不多说,直接上图:

    我发现改变数据可改变那几个小亮点的颜色和形状,而改变地址如改成b820:0000可改变小亮点的位置。

    可改变地址时选用有些地址(如a880:1000)则看不出任何改变,我猜测是内存中分配了专门的b810:0000附近的空间来改变小亮点的位置。

    小小总结一下:

     通过这次实验,我熟练掌握了debug环境中几个基础命令的使用,还在操作错误中发现了之前不知道的知识点(如dosbox中默认以16进制输入)。

    这次实验只是一个开始,它让我初步体会到了汇编的乐趣。我也会在接下来的学习中再接再厉,尽情地探索这门语言地奥秘。

    我在班级博客中发现有一位同学(@无ni不欢)对各个命令做了非常详尽全面的说明,在此与大家分享:https://www.cnblogs.com/cjh-1023/p/9852399.html  (侵删)

  • 相关阅读:
    137. Single Number II (Bit)
    136. Single Number (Bit)
    89. Gray Code (Bit)
    57. Insert Interval (Array; Sort)
    56. Merge Intervals (Array; Sort)
    UNIX 网络编程笔记-CH3:套接字编程简介
    UNIX 网络编程笔记-CH2:TCP、UDP概貌
    TSP-旅行商问题
    Java 集合:迭代器(Iterator, Iterable)
    PAT 1029. Median
  • 原文地址:https://www.cnblogs.com/wlxnw/p/9855874.html
Copyright © 2020-2023  润新知