本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著
@[toc]
实验前别忘了复习之前的笔记
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
分析
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0 ;入口
s: nop ;机器码复制到这里,即jmp short s1的 机器码
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax ;将s2处复制到s处
s0: jmp short s ;返回运行s
;==========只用看上半段==========
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
答案
程序是可以正常运行的程序运行到s0处,跳转到s处运行复制的s1机器码。段间转移的本质是基于偏移量,而不是标号的当前地址。
这里s2的机器码jmp short s1存储的偏移量刚好与s处到返回值的偏移量一致,因此s处跳转到第一行mov ax,4c00h,接着正常退出程序了
Debug运行一下,复制后S(ds:8)的机器码是EBF6
跳转到S处运行,S处继续跳转到第一行,也就是程序出口
程序可以正常运行
这里恰好位移量相同可以正常运行,强调的是jmp的机器码存储的是计算好的位移量而不是当前标号的地址,切记