实验1 8086汇编指令编码和调试
一、实验目的
1. 掌握8086CPU、寄存器、内存(包括栈空间)的基础知识
2. 掌握汇编源程序组成与结构
3. 理解和掌握寄存器间接寻址方式[bx]
4. 掌握汇编指令mov, add, sub, jmp, push, pop,loop的用法,理解高级语言的表达和抽象机制
5. 熟练掌握使用debug工具编写和调试x86汇编命令的方法
6. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
二、实验结论
实验任务2:
使用d命令查看生产时期
无法修改生产日期
实验任务3:
使用e命令修改内存单元后的情形
f命令批量填充内存单元后的情形
尝试向其他字节填充指令:
实验任务4:
(1)
栈顶逻辑地址:0020:30
栈顶物理地址:00230H
观察并记录栈顶偏移地址的寄存器sp值的变化情-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_
(2)
(3)
汇编指令执行完之后,内存空间的数据没有发生变化。
(4)
在改变顺序之后,顺序发生了改变,因为出栈的顺序发生了改变。
实验任务5:
问1:
答:不是. mov sp ,30 在 mov ss,ax 执行完后及跟着执行。
问2:
答:因为进栈时要遵守后进先出的原则,并且低位在前。
实验任务6:
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
实验任务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 17h
由于是复制当前程序,当前程序的程序段地址存储在CS
中,因此将CS
中的数据移至DS
寄存器作为数据段,所以第一空填cs。而第二空17h则是通过先编译程序后观察程序的大小决定,如下图:
可以看到程序到mov ax, 4c00h
指令之前共占用了17h个字节,因此需要循环17h次。
(2)
已经正确复制到了0:200
开始的地址空间中