《汇编语言(3rd)》王爽 - 实验8

程序可以正常返回:

  1. mov ax, cs:[si] 和 mov cs:[di], ax 两条指令将标号 s2 处的指令(好吧,实际上程序运行的时候指令已经被编译器转换成偏移形式的字节码了)复制到了 s 处,该字节码正好是两个字节,刚好放置在两个 nop 符处
  2. 使用 debug 运行程序,我们发现 jmp short s1 对应的字节码是 EBF6,这是补码形式表示的,二进制表示是 1111 0110, 负数的补码是除符号位按位取反,然后加 1, 结果是 1000 1010, 即 -10, 回跳 10 个字节,即从 jmp short s1 (s1 标号处)的下一个字节的偏移地址 a (注释右边部分是在本人机器上的偏移地址) 处,回跳 10 个字节之后,执行偏移地址 0 处的代码,程序可以正常返回。
assume cs:codesg
codesg segment                            ; 偏移地址:
	mov ax, 4c00h                           ; 0
	int 21h                                 ; 3
	start: mov ax, 0                        ; 5
	s:  nop ; jmp short s1                  ; 8
		nop                                   ; 9
		mov di, offset s                      ; a
		mov si, offset s2                     ; d
		mov ax, cs:[si] ; jmp short s1        ; 11
		mov cs:[di], ax                       ; 14
	s0: jmp short s                         ; 16
	s1: mov ax, 0                           ; 18
		int 21h                               ; 1B
		mov ax, 0                             ; 1D
	s2: jmp short s1                        ; 20
		nop                                   ; 22
codesg ends
end start						
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡德咏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值