zoukankan      html  css  js  c++  java
  • 实验4 [bx]和loop的使用

    四、实验结论

    任务一:综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H。

    (1)编写汇编源程序loop1.asm

    assume cs:code
    code segment
        mov ax,0b800h
        mov ds,ax
        mov ax,0403h
        mov bx,07b8h
        mov cx,16
          s:mov [bx],ax
        inc bx
        inc bx
        loop s
        mov ax,4c00h
        int 21h
    code ends
    end

    (2)对源程序 t1.asm 进行汇编、连接、运行;

    step1:编译;

    step2:连接;

    step3:运行;

    运行程序之后会在屏幕上出现16个红色爱心,这个就是在显存中存储数据,我们所存入的0403h就代表着一个红色爱心的字符。


    如果将0403h变为0441h,重新编译、连接和运行之后得到如下结果:

    由此可以猜测,04应该是控制红色的数据,后面两个03控制的是爱心字符,41控制的是字符A;


    注:我利用了debug进行调试,运行之后查看了b800:07b8开始的连续内存如图:

    但是发现内存中的数据并没有改变为0403h,而且此段内存为显存


    任务二:综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)。

    (1)编写汇编源程序loop2.asm;

    assume cs:code
    code segment
    mov ax,0h
    mov ds,ax
    mov cx,63
    mov bx,200h
    mov ax,0
    s:mov [bx],ax
    add ax,1
    inc bx
    loop s
    mov ax,4c00h
    int 21h
    code ends
    end

    (2)对源程序 t1.asm 进行汇编、连接、运行;

    step1:编译;

    step2:连接;

    step3:运行;

    运行之后屏幕上没有任何显示;


    以下操作是进入debug环境进行调试的:

    (1)在debug中运行loop2.exe文件并查看当前各个寄存器中的值;

    (2)我们通过u命令进行反汇编;

    (3)用g命令执行到mov ax,4c00h之前;

    (4)用t命令单部执行;

    (5)下一步即将执行int 21h,接下来用p命令执行;

    注:如果用g命令执行到int 21h之前,则会发生如下情况:

    即cx的值没有发生任何改变;


    任务三: 下面的程序功能是将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

    assume cs:code
    code segment
        mov ax,076ah
        mov ds,ax
        mov ax,0020h
        mov es,ax
        mov bx,0
        mov cx,14
          s:mov al,[bx]
        mov es:[bx],al
        inc bx
        loop s
        mov ax,4c00h
        int 21h
    code ends
    end

    根据任务二,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。

    (1)当前偏移地址为076a,所以将数据传入段寄存器CS中;

    (2)由于此段内存空间有14个字节单元,所以执行14次循环;

    一、对源程序 t1.asm 进行汇编、连接、运行;

    注:Required parameter missing 的原因是什么?

    二、进入debug进行调试

    step1:在执行任务二之后查看当前代码的机器码所存储的位置;

    step2:运行copy.exe文件并查看当前各个寄存器的值;

    step3:进行反汇编;

    step4:利用g命令执行;

    step5:利用t命令和p命令执行;

    step6:查看0:200之后的字节;

    可以看出我们已经将数据存入了0:200开始的内存;

  • 相关阅读:
    Linux之C编译器gcc和makefile使用简介
    基于OWin的Web服务器Katana发布版本3
    OAuth和OpenID的区别
    关于 Token,你应该知道的十件事
    HTTP Header 详解
    Entity Framework教程及文章传送门
    CSP(Content Security Policy) 入门教程
    gulp构建工具的几个使用技巧
    浅谈程序员的英语学习
    如何选择正确的angular2学习曲线?
  • 原文地址:https://www.cnblogs.com/Sun-Yiwen-blog/p/9981165.html
Copyright © 2011-2022 走看看