(四)《汇编语⾔(王爽)》检测点3.1、3.2
⽂章⽬录
1. 检测点 3.1
(1)使⽤ d 指令查看 0000:0000~0000:001F 的内存值,并写出每条汇编指令执⾏完后相关寄存器中的值。
8086CPU 中的 DS 寄存器⽤于存放将要访问数据的段地址(CS ⽤于存放代码地址),mov、sub、add 指令可实现寄存器和内存单元(使⽤中括号)之间值的操作。如,mov al,[0] 将段地址为 DS、偏移地址为 0 的内存单元数据送⼊ al 寄存器中,DS 的计算公式同 CS:IP。
8086CPU 不⽀持直接将数据送⼊段寄存器中,如 mov ds,1000 错误,⽽需要使⽤使⽤其他寄存器周转,如 mov ax,1000 mov ds,ax。
⾸先,假如使⽤ d 指令查看 0000:0000~0000:001F 内存单元的值为:
0000:00007080 F0 30 EF 6030 E2-0080801266202260
0000:00106226 E6 D6 CC 2E 3C 3B-AB BA 000026066688
每条汇编执⾏执⾏完成后相关寄存器中的值为:
指令AX BX DS
mov ax,1000100000000
mov ds,ax000100000001
mov ax,[0000]266200000001
mov bx,[0001]2662E6260001
mov ax,bx E626E6260001
mov ax,[0000]2662E6260001
mov bx,[0002]2662D6E60001
add ax,bx FD48D6E60001
add ax,[0004]2C14D6E60001
mov ax,00000D6E60001
mov al,[0002]00E6D6E60001
mov bx,000E600000001
mov bl,[000C]00E600260001
add al,bl000C00260001
注:上述⿊体部分中,低位的运算没有影响到⾼位。
(2)内存中的情况如下图:
在这⾥插⼊图⽚描述
各寄存器的初值为:CS=2000H、IP=0、DS=1000H、AX=0、BX=0。
① 使⽤汇编代码写出 CPU 执⾏的指令序列。
② 写出 CPU 每条指令执⾏后,相关寄存器中的数值。
③ 程序和数据的区别。
CPU 从 CS:IP 处开始执⾏指令,执⾏完每条指令后,IP 的值加上上⼀条指令的长度。
使⽤ jmp 指令修改 CS:IP 的值,jmp 段地址:偏移地址,如 jmp 2AE3:3 后,CS=2AE3H、IP=0003H,并且 CPU 将从 2AE3:3 处读取指令并执⾏;或 jmp 某⼀合法寄存器名,如 jmp AX 后,IP=AX。
CPU 总是从 CS(2000H):IP(0) 处开始执⾏指令:
指令AX BX CS IP DS mov ax,6622H66220000200000031000
jmp 0ff0:0100H66220000100000001000
mov ax,2000H20000000100000031000 mov ds,ax20000000100000052000 mov ax,[0008]C1890000100000082000
mov ax,[0002]EA6600001000000B2000
注意,上述⿊体部分是将内存单元中的值送⼊寄存器内,中括号内指明了内存单元的偏移地址,段地
址由 DS 寄存器的内容决定。不同的CS:IP 组合可能指向同⼀内存地址,如上述表格第⼆⾏将 CS=0FF0、IP=0100 写作 CS=1000、IP=0000,它们都执⾏内存单元10000。
总结:寄存器 CS 和 IP 控制 CPU 执⾏指令的顺序,寄存器 DS 配合偏移地址指明数据存放的位置。
2. 检测点
3.2
(1)补全程序,使其可以将 10000H~1000FH 中的 8 个字逆序拷贝到 20000H~2000FH 中。
栈是⼀种具有后进先出(LIFO)性质的数据结构。
8086CPU 中⼊栈(push)和出栈(pop)操作都以字(两个字节)为单位,使⽤ SS:SP (和 CS:IP 指⽰指令位置类似)来指⽰栈顶的位置。栈顶从⾼地址往低地址⽅向增长,即⼊栈时 SP 的值减⼩、出栈时 SP 的值增⼤。
在栈为空时,SS:SP 指向栈空间最⾼地址单元的下⼀单元。
栈顶超界可能导致其他内存单元数据被更改⽽产⽣意向不到的情况,8086CPU 不提供限制栈顶超界的情况。
push 和 pop 指令后可接寄存器或以中括号表⽰的内存单元(结合 DS 寄存器)的值。
mov ax,1000H
mov ds,ax
________ ;mov ax,2000H
________ ;mov ss,ax
________ ;mov sp,0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
最后⼏条指令往栈内压⼊数据,根据题意是将数据压⼊内存 20000H~2000FH 内。前⾯已经设定好 DS 寄存器的值为 1000,所以 push [0] 操作的数据是 1000:0,后⾯类似。
所以,前⾯需先设定 SS:SP 的值,由于栈顶从⾼地址往低地址增长,所以初始时 SS=2000、SP=0010 表⽰栈空状态。由于 8086CPU 不⽀持将数据直接送放⼊段寄存器,⽽需要通过另⼀个寄存器周转,所以三条指令完成 SS 和 SP 指令的复制。
(2)补全程序,使其可以将 10000H~1000FH 中的 8 个字逆序拷贝到 20000H~2000FH 中。
mov ax,2000H
mov ds,ax
________ ;mov ax,1000H
________ ;mov ss,ax
________ ;mov sp,0000H
汇编指令有多少个pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
这题要求和上⼀题⼀样,上⼀题使⽤的是 push 指令,这道题使⽤ pop 指令,如 pop [E] 将栈顶元素送⼊内存单元 [E] 内并移动栈顶指针。内存单元的偏移地址为 000E,段地址由寄存器 DS 决定。
题⽬前两条指令已经设定好 DS 寄存器的值,和上⼀题类似,中间三条指令的功能是设定好 SS:SP 的值,所以初始时 CS=1000、SP=0000 表⽰栈满状态使得出栈元素依次放⼊ 2000FH~20000H 中。