曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 9.4 9.5 9.6 转移的目的地址以及转移地址在寄存器和内存中的jmp指令

9.4 转移的目的地址在指令中的jmp指令

之前的jmp指令语法都是相当于当前IP的转移位移。

jmp far ptr 标号 该命令实现的是段间转移,这种转移也被成为远转移。功能如下:

(CS)=标号所在段的段地址;(IP)=标号在段中的偏移地址。

如下指令,

assume cs:codesg
  codesg segment
    start:mov ax, 0
          mov bx, 0
          jmp far ptr s
          db 256 dup (0)
        s:add ax, 1
          inc ax
  codesg ends
end start

对其进行编译并使用debug跟踪,查看其机器代码如下,

figure1

观察076A:0006,jmp 相关指令为EA0B016A07,指令EA为jmp的机器指令,后面的0B016A07为相应的跳转地址,由于机器码与汇编程序地址相反,高位在前,低位在后,所以对应着jmp cs(076A):ip(010B)

9.5 转移地址在寄存器中的jmp指令

所谓转移地址在寄存器中,即通过jmp到寄存器中来实现段内近转移,这时寄存器中存放IP的值。

jmp 16位reg,实现功能为:(IP)=(16位reg)

如下,

jmp ax

ax中为IP的值,实现的是段内近转移

9.6 转移地址在内存中的jmp指令

转移地址在内存中的jmp指令有两种格式:

(1) jmp word ptr 内存单元地址(段内转移):

功能:从内存单元地址处开始存放一个字单元,是转移的目的的偏移地址

内存单元地址可用寻址方式的任一格式给出。

代码如下,

mov ax, 0123H
mov ds:[0], ax
jmp word ptr ds:[0]

执行后,(IP)=0123H。或者如下,

mov ax, 0123H
mov [bx], ax
jmp word ptr [bx]

执行后,(IP)=0123H。

(2) jmp dword ptr 内存单元地址(段间转移):

功能:从内存单元地址处开始存放两个字单元,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址

(CS)=(内存单元地址+2) (IP)=(内存单元地址)

内存单元地址可用寻址方式的任一格式给出。

例如代码,

mov ax, 0123H
mov ds:[0], ax
mov word ptr ds:[2], 0
jmp dword ptr ds:[0]

执行后,(CS)=0, (IP)=0123H, CS:IP指向0000:0123H。高位为0000–>CS,低位为0123H–>IP。

又如下面代码,

mov ax, 0123H
mov [bx], ax
mov word ptr [bx+2], 0
jmp dword ptr [bx]

执行后,(CS)=0,(IP)=123H,CS:IP指向0000:0123H。

练习:

(1) 程序如下:

assume cs:code
data segment
?
data ends

code segment
  start:mov ax, data
        mov ds, ax
        mov bx, 0
        jmp word ptr [bx+1]
code ends
end start

问题:若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?

分析可知在执行jmp word ptr [bx+1],由于[bx+1]被指定为word格式,说明是在内存单元地址的段内转移

另一方面由于[bx]中为0,所以等同于jmp word ptr [1]跳转到0000地址。所以data中为dd 0db 4 dup 0dw 2 dup 0

(2) 程序如下:

assume cs:code
data segment
  dd 12345678H
data ends

code segment
  start:mov ax, data
        mov ds, ax
        mov bx, 0
        mov [bx], ______
        mov [bx+2], ______
        jmp dword ptr ds:[0]
code ends
end start

补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令。

jmp dword ptr ds:[0],可以看出是dword格式,判断为转移地址在内存中的段间转移。由于CS:IP指向程序的第一条指令,所以CS:IP应该为CS:0000,故第一个位置应该为mov [bx], bxmov [bx], word ptr 0mov [bx], offset start等等,总之表示IP地址为0000。而第二个位置应该为mov [bx+2], CS或者mov [bx+2], seg code等等,总之表示其CS的段地址

(3) 用Debug查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 …

则此时,CPU执行指令:

mov ax, 2000H
mov es, ax
jmp dword ptr es:[1000H]

这时的(CS)和(IP)为多少?

对于双字类型的jmp指令,判断为段间跳转,即跳转到es:[1000H],也就是2000H:1000H地址。这时的CS为高位0006,IP为低位00BE。这里需要注意的是,无论地址为多少,jmp都把相应地址所指的高位作为CS地址,而低位作为IP地址

另外记住,在数据段中,后面的数据为高位, 前面的数据为低位!

Last One

汇编语言 9.7 9.8 jcxz loop 指令

9.7 jcxz 指令jcxz 指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128~127。指令格式:jcxz 标号(如果(cx)=0, 转移到标号处执行。)操作:当(cx)=0时,(IP)=(IP)+8位位移;8位位移 = 标号处的地址 - jcxz指令后的第一个字节的地址;8位位移的范围为-128~127,用补码表示;8位位移由编译程序在编译时算出。当(cx)!=0时,程序继续向下执行。我们从jcxz的功...…

汇编语言More
Next One

python 魔法方法 (3) 反运算 一元操作符

整理自小甲鱼鱼C论坛反运算执行反运算时首先观察加法规则:$$ a + b $$这个加法中,首先来确定谁是加法的主动一方,谁是被加一方。a 是主动实施加法的一方,而b则是被加一方。而反运算描述的就是被加一方的相关的算数性质。如下:calss Nint(int): def __rsub__(self, other) return int.__sub__(other, self)>>> a = Nint(5)>>> b = Nint(3)&...…

pythonMore