实验1 8086汇编指令编码和调试

1.实验任务1

 

2.实验任务2

利用d命令查看生产日期为01/01/92

实验1 8086汇编指令编码和调试

试图利用e命令修改生产日期,并用d命令再次查看,发现生产日期没有改变

 实验1 8086汇编指令编码和调试

 结论:生产日期不可修改,是由于该内存地址为ROM,ROM中的信息不可被更改

 

3.实验任务3

用e命令向指定内存单元b800:0填写数据 04 03,重复五次;可在左上角观察到输出结果“5个红色爱心”,结果如下:

实验1 8086汇编指令编码和调试

 再用f命令向指定内存单元b800:0f00重复填写数据04 03

使用d命令观察到数据已经被写入到内存中,但没有任何输出结果

实验1 8086汇编指令编码和调试

 修改b800:0 9中的数据,观察到不同的输出结果

实验1 8086汇编指令编码和调试

 

 造成上述情况的原因是:在8086中,地址A0000H~BFFFFH为显存地址空间,数据会呈现为输出结果显示在输出设备上

 

4.实验任务4

利用e命令,修改00200H~00207H内存单元中的数据为10 20 30 40 50 60 70 80

实验1 8086汇编指令编码和调试

填空:

-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = 002E
push [2] ; 执行后,寄存器(sp) = 002C
push [4] ; 执行后,寄存器(sp) = 002A
push [6] ; 执行后,寄存器(sp) = 0028
pop [6] ; 执行后,寄存器(sp) = 002A
pop [4] ; 执行后,寄存器(sp) = 002C
pop [2] ; 执行后,寄存器(sp) = 002E
pop [0] ; 执行后,寄存器(sp) = 0030

 

1)在t命令单步执行后,执行push指令SP=SP-2,执行pop指令SP=SP+2;

mov ss,ax和mov sp,30执行后,

栈顶的逻辑地址为:0020:0030,实际地址为:00230H

实验1 8086汇编指令编码和调试

 

 

2)在执行完push[6],且还未执行pop[6]时,用d命令查看栈内存中数据如下:

实验1 8086汇编指令编码和调试

 

 3)在执行完pop[0],用d命令查看栈内存中数据如下:

实验1 8086汇编指令编码和调试

 

4)改变后四条指令如下:

实验1 8086汇编指令编码和调试

 

发现数据空间内的数据呈倒序排列:

实验1 8086汇编指令编码和调试

 

5.实验任务5

实验1 8086汇编指令编码和调试

实验1 8086汇编指令编码和调试

实验1 8086汇编指令编码和调试

 问题1:用t命令执行mov ss,ax后没有暂停,mov sp,30紧接着得到执行

即Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行

 问题2:00220H~0022fH被设置为栈,且值均为0,

程序段中将栈顶指针设为了0020:0030,指向栈的中间

 CS:IP与栈中值相同,即第一条程序存放在栈中

 

6.实验任务6

编写如下8086汇编程序源码

task6.asm

assume cs:code
code segment
start:
    mov cx, 10
    mov dl, '0'
s:     mov ah, 2
    int 21h
    add dl, 1
    loop s

    mov ah, 4ch
    int 21h
code ends
end start

汇编链接过程截图

  实验1 8086汇编指令编码和调试

 可执行程序task6.exe执行结果:

 实验1 8086汇编指令编码和调试

 

 

 在debug中,用d命令查看PSP,前两个字节为CD 20

实验1 8086汇编指令编码和调试

 

 

 

7.实验任务7

 补充后完整程序:

assume cs:code
code segment
    mov ax, cs
    mov ds, ax
    mov ax, 0020h
    mov es, ax
    mov bx, 0
    mov cx, 17h
s:     mov al, [bx]
    mov es:[bx], al
    inc bx
    loop s

    mov ax, 4c00h
    int 21h
code ends
end

1)CS:IP指向了第一条程序,因而若要复制整个程序,需要将段地址cs赋值给寄存器ds,所有第一个空为cs

     除去最后两条返回指令,其余指令长度为17h(2+2+3+2+3+3+2+2+2+2=23=17h),cx中为控制循环次数的数

2)先使用u命令,查看反汇编代码

实验1 8086汇编指令编码和调试

 

 由LOOP的物理地址可知,用命令“g 076a:0017”将程序执行到loop s之后,mov ax,4c00之前

然后用u命令对0:200进行反汇编,得到结果:

实验1 8086汇编指令编码和调试

得以验证该程序是正确的

上一篇:IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)


下一篇:实验一 汇编指令编码和调试