实验1 —— 用机器指令和汇编指令编程(2)

debug 指令补充

在执行 d 命令时可以带地址参数 (段地址: 偏移地址),其中的段地址会先被送到 ds 寄存器,再交给处理器。

因此,d 命令也可以这样用: d SR:offset (SR指段寄存器)

例如:

-r ds
:1000
-d ds:0         ;查看从 1000:0 开始的内存区间中的内容
-r ds
:1000
-d ds:10 18     ;查看 1000:10 ~ 1000:18 中的内容
-d cs:0         ;查看当前代码段中的指令代码
-d ss:0         ;查看当前栈段中的内容

当然 e 命令、a 命令和 u 命令也是一样的。

例如:

-r ds
:1000
-e ds:0 11 22 33 44 55 66        ;在从 1000:0 开始的内存区间中写入数据 
-u cs:0         ;以汇编指令的形式,显示当前代码段中的代码,0 代码的偏移地址
-r ds
:1000
-a ds:0         ;以汇编指令的形式,向从 1000:0 开始的内存单元中写入指令

有趣的现象

在执行以下的代码时,你会发现 t 命令会不管用:

mov ax, 2000        ; 1
mov ss, ax          ; 2
mov sp, 10          ; 3

mov ax, 3123        ; 4
push ax             ; 5
mov ax, 3366        ; 6
push ax             ; 7

单步执行结果如下图所示:

可见第 2 行和第 3 行代码一起执行了 (我这里与书本上的展示不同,可能与软件版本有关)。

具体是怎么回事以后深究,我们需要知道的是: 在执行修改 ss 寄存器的指令时,下一条指令会被一并执行。

实验

本实验为《汇编语言》(王爽著,第 3 版)第 74 页 实验任务

  1. 将下面的程序写入内存,执行并填空:

    为了便于验证实验结果,对该实验做如下两点调整:

    1. 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:00021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H
    2. 将该实验中第 1 行的 mov ax, ffff 改为 mov ax, 0021
    mov ax, 0021
    mov ds, ax
    
    mov ax, 2200
    mov ss, ax
    mov sp, 0100
    
    mov ax, [0] ; ax = _3130_
    add ax, [2] ; ax = _6462_
    mov bx, [4] ; bx = _3534_
    add bx, [6] ; bx = _6c6a_
    
    push ax      ; sp =  _00fe_ ; 修改的内存单元的地址是 _220fe_ 内容为 _6462_
    push bx      ; sp =  _00fc_ ; 修改的内存单元的地址是 _220fc_ 内容为 _6c6a_
    pop ax       ; sp =  _00fe_ ; ax = _6c6a_
    pop bx       ; sp =  _0100_ ; bx = _6462_
    
    push [4] ; sp =  _00fe_ ; 修改的内存单元的地址是 _220fe_ 内容为 _3534_
    push [6] ; sp =  _00fc_ ; 修改的内存单元的地址是 _220fc_ 内容为 _3736_

    填空已经写进了注释,运行结果如下图所示:

    这个实验在 FreeDOS 中会报错,如下图所示:

    最后不得不用了 MS-DOS,我分析原因是 FreeDOS 不完全兼容 16 位汇编出现 operand size mismatch

  2. 为什么 2000:0 ~ 2000:f 中的内容会发生改变?

    运行结果如下图所示:

    仔细观察执行后 2000:a2000:d 内存中的数据,可见正好是依照小端法存储的 csip 的值,据网上资料所说,这是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的 10 个字节中的暂存数据分别是 ssipcs 等的值,是否正确我尚未考证,但应该与系统的调度有关。

我认为汇编是计算机专业的必修课,在计算机系统中也好,单独作为一门课程也罢,真正需要学习的不是怎么用,这是为了弥补一个计算机专业学生的基本常识。如果只是觉得什么东西有用而学它,那是没有回报的。如果你只看到一件事的1%,不代表你看到了它剩下的99%。在一切因素都不确定的情况下,能做好自己本分又有多少。干些什么吧,趁自己还年轻。

Invictus maneo.

原文地址:https://www.cnblogs.com/jordangong/p/9863597.html

时间: 2024-10-03 09:25:59

实验1 —— 用机器指令和汇编指令编程(2)的相关文章

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

一.实验目的 1.熟悉基本debug命令:a.r.d.e.u.t 2.掌握汇编指令与机器指令的对应关系 3.掌握利用debug命令查看修改内存.寄存器的方法 二.实验要求 (1)仔细阅读实验教程中DEBUG的使用部分: (2)使用DEBUG中的A命令输入一段程序段: (3)用DEBUG中的R命令观察寄存器中数据的存放情况,改变寄存器的值: (4)用DEBUG中的D命令查看数据在内存中的表示方法: (5)用DEBUG中的E命令修改内存中的数据: (6)用DEBUG中的T命令执行一条语句: 三.实验

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

实验二  用机器指令和汇编指令编程 任务一: (1)用E命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H. (2)用A命令输入汇编指令: (3)用T命令单步执行: 在用T命令执行MOV SS,AX时,它的下一条指令MOV  SP,0100同时执行. (4)填写书上内容: 任务二: 观察如图实验过程,分析为什么2000:0~2000:f中的内容会发生改变. 任意时刻,SS:SP指向栈顶元素,初始时栈为空.初始时,栈顶为0B

【汇编语言】实验2 用机器指令和汇编指令编程(2)

四.实验结论 任务一:使用debug,将下面程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空. 1.使用r命令查看各寄存器初始值. 2.使用a命令编写汇编指令. 3.使用t命令单步执行. 4.分析 此实验使用栈实现了寄存器值的交换 指令 ax bx ss sp mov ax,ffff FFFF 0000 073F 00FD mov ds,ax FFFF 0000 073F 00FD mov ax,2200   2200 0000 073F 00FD mov ss,ax   2200 0

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

实验结论 实验任务(1) 1.使用 e 命令修改 0021:0~0021:f 数据,及修改后查看是否正确写入的操作 2.使用 a 命令输入指令 3.每一行指令单步调试 4.指令执行后各个寄存器存值情况 mov ax,[0];             ax=3130H add ax,[2];              ax=6462H mov bx[4];              bx=3534H add bx,[6];              bx=6C6AH push ax;       

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

实验任务 (1)使用debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空. a.使用 e 命令修改 0021:0~0021:f 数据为30H,31H,32H,33H,34H,35H,36H,37H,并查看. 截图 b.将下面的程序段写入内存 mov ax,0021 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0]:                                             ax=3

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

1.预备知识:Debug的使用 Debug在执行"d 1000:0"时,会将段地址送入ds中. Debug的命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行. 2.实验任务 补充: 为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整: ① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H ② 将 P74 实验任务(1)中第 1

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

 1. 预备知识:     用T命令执行修改栈寄存器SS的指令,如mov ss,ax,mov ss,[0],pop ss等时,它的下一条关于修改偏移地址SP的指令也紧接着执行,一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但如上情况却没有做到这点.这种现象属于后期学习内容:中断机制. 2. 实验任务 (1)使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空.   mov ax, 0021 mov ds, 

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

1.使用Debug,将下面的程序段写入内存,逐条执行,将执行结果与实验前结果比对. 前提:用E命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H. (1)实验前理论分析. mov ax,oo21 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0]                    :ax=3130H add ax,[2]                     

用机器指令和汇编指令编程(修改版)

实验名称 用机器指令和汇编指令编程(1) 实验日期   2018.10.22 学院:计软院 专业:计算机科学与技术 年级:2017级 班次:5班 姓名:陈奕明 学号 20171308194 一.实验目的 1. 掌握使用debug工具编写和调试汇编命令的方法 2. 掌握第1-2章所学的关于CPU.寄存器.内存的基础知识 3. 掌握第1-2章涉及的几条指令mov, add, sub, jmp的用法 二.实验准备 1. 复习教材第1~2章内容,完成教材内相关检测点 2. 结合教材实验1 (P35)及公