程序从
s
t
a
r
t
start
start入口处开始执行,一个nop指令占一个字节并表示No operation,此处用了两个nop指令的目的是在
s
s
s处预留两个字节的空间,程序执行mov cs:[di], ax之后
s
s
s处的两个字节被试图写入jmp short s1,接着程序向下执行jmp short s使得程序跳转回
s
s
s处开始执行。
jmp short s1到底做了什么:修改IP使其前进十个字节。因为该指令本身的作用是使IP从
s
2
s2
s2跳转到
s
1
s1
s1,即从
s
2
s2
s2处的jmp指令的下一指令nop
(
076
C
:
0022
)
(076C:0022)
(076C:0022)跳转到
s
1
s1
s1处的mov ax, 0
(
076
C
:
0018
)
(076C:0018)
(076C:0018),因为jmp short 标号是依据位移进行转移的指令,而此处位移大小为
0022
H
−
0018
H
=
−
10
D
(
F
6
H
)
0022H-0018H =-10D(F6H)
0022H−0018H=−10D(F6H),所以
s
s
s处的jmp short s指令的机器码为EBF6(刚好占两个字节,因此可以被正确写入
s
s
s处)
执行
s
s
s处的跳转指令,使得
I
P
=
I
P
+
(
−
10
)
IP = IP+(-10)
IP=IP+(−10),即向前移动十位,用debug跟踪程序,可以看到向前第十个指令为mov ax, 4c00H
(
000
A
H
−
0010
H
=
0000
H
)
(000AH-0010H=0000H)
(000AH−0010H=0000H),程序从此处开始向下执行,最终可以正确退出
实验9 根据材料编程
编写源程序:最开始我试图用mov address,data的形式直接向显存中写入数据,并且比较蠢的一个字符一个字符的输入,但这种形式的mov指令对显存区域似乎并不奏效,实操之后发现显存内容未被修改为给定值,并且其内容还在动态的变化(如果你知道为什么,麻烦评论区告诉我)。之后利用栈存储数据welcome to masm!,利用寄存器
a
x
ax
ax作介质,用mov指令实现内存之间的内容交换,避免了重复手动输入数据
代码分析
结构图 代码
public class Product {//产品类,多个部件构成List <String> parts new ArrayList<>();public void Add(String part){parts.add(part);}public void show(){System.out.println("creat parts");for(String part:parts){System…
给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶…