小结:实验8 分析一个奇怪的程序

	assume cs:code
	code segment
0H		mov ax, 4c00H
3H		int 21H
	start:
5H		mov ax, 0
	s:
8H		nop
		nop
aH		mov di, offset s	;di=0005H
		mov si, offset s2	;si=0020H
		;cs:[si]指向cs:0020H,所以s2标号下的jmp shorts1指令(大小刚好一个字)被拷贝到ax中
		mov ax, cs:[si]		
		;cs:[di]指向cs:0005H,所以ax中的值被拷贝到s标号开头的一个字单元,即jmp short ;s1被拷到了s开头处,取代了两个nop指令
		mov cs:[di], ax		
	s0:
		;编译器计算跳转的偏移值是用标号的偏移-下一条指令的偏移,
		;此处即8H-18H=-10H,所以编译后为jmp -10H,
		;当执行jmp -10H时,ip=ip+(-10H),
		;此处就是ip=18H+(-10H)=8H,就跳转到了s处了
16H		jmp short s
	s1:
18H		mov ax, 0
		int 21H
		mov ax, 0
	s2:
		;标号偏移-下一条指令偏移=18H-22H=-aH
		;此处编译后为jmp -aH,
		;由于s0处跳转到了s处所以这段代码在s处执行,
		;在s处执行jmp -aH时,ip=ip+(-aH)=aH+(-aH)=0H,所以跳转到了cs:0000H处,程序成功退出
20H		jmp short s1
22H		nop
	code ends
	end start


 
  
 
 

你可能感兴趣的:(汇编语言(王爽)学习记录)