汇编语言 EAX怎么得到EIP的地址?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言 EAX怎么得到EIP的地址?相关的知识,希望对你有一定的参考价值。

详细题目是编写一个程序段,若EIP低位为0,使EAX为0,否则为1.
这是我们老师自己出的,也不知道是不是有什么错误。
请高人指点!!!
.386 ;可以使用386指令集,定义32位段程序
.MODEL FLAT, stdcall ;定义存储模式
include \masm32\include\io32.inc ;自定义的32位输入输出包含文件
.STACK 4096 ; 定义堆栈段,大小为4096(一页)
.DATA ; 定义数据段
.CODE ; 代码段
start: ;地址标号
test eip,0001h
jz m1
mov eax,1
jmp done
m1: mov eax,0
done: ret ;程序返回操作系统
END start ; 汇编结束

连接的时候出现错误
ERROR A4910:CANNOT OPEN FILE:E\MASM32\BIN\\ML.ERR
E:\MASM32\1.ASM<9>:ERROR A2006: :EIP
-
ASSEMBLY ERROR

参考技术A 可以这样写:
code segment
assume cs:code
main proc far
start:
call ok
mov ax,4c00h
int 21h
main endp

ok proc near
pop ax
ret
ok endp
code ends
end start
在调用子程序的同时,将IP入栈用来返回调用前的地址。子程序中再将入栈的IP值赋给AX,此时AX中保存的即为CALL OK的下一条指令的偏移地址。即子程序返回后IP的值。MOV等指令是无法直接改变IP值的。EIP应该同理。以上程序DEBUG通过。感觉汇编不是很容易。。要加油啊!
参考技术B 直接用test指令测试eip的末位,为零则置eax为零,否则置eax为1 参考技术C MOV AH,13H
MOV AL,88H
MOV BH,03H
MOV BL,0EBH
DIV BX
结果 AH 保存商 AL保存余数

汇编学习笔记

EIP  用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。

jmp 分为段间转移和段内转移,段间转移需要提供新的段地址和偏移地址。

ip    instruction pointer,即 段,用来存储将要执行的下一条指令的偏移量

条件转移指令:v(1)根据单个标志位的状态判断转移的指令

指令 转移条件 说明
JC DEST CF=1 有进位/借位
JNC DEST CF=0 无进位/借位
JE/JZ DEST ZF=1 相等/等于零
JNE/JNZ DEST ZF=0 不相等/不等于零
JS DEST SF=1 是负数
JNS DEST SF=0 是正数
JO DEST OF=1 有溢出
JNO DEST OF=0 无溢出
JP/JPE DEST PF=1 有偶数个“1”
JNP/JPO DEST PF=0 有奇数个“1”
v(2)根据两个有符号数的比较结果判断转移的指令

 

指令 转移条件 含义 英文表述
  
JG/JNLE DEST SF=OF AND ZF=0 有符号数A>B JMP greater (not less or equal)
JGE/JNL DEST SF=OF OR ZF=1 有符号数A≥B JMP greater or equal (not less)
JL/JNGE DEST SF≠OF AND ZF=0 有符号数A<B JMP less (not greater or equal)
  
JLE/JNG DEST SF≠OF OR ZF=1 有符号数A≤B JMP less or equal (not greater)

v(3)根据两个无符号数的比较结果判断转移的指令 v

指令 转移条件 含义 英文表述
  
JA/JNBE DEST CF=0 AND ZF=0 无符号数A>B JMP above (not below or equal)
JAE/JNB DEST CF=0 无符号数A≥B JMP above or equal (not below )
JB/JNAE DEST CF=1
  
无符号数A<B JMP blow (not above or equal)
  
JBE/JNA DEST CF=1 OR ZF=1 无符号数A≤B JMP blow or equal (not above)
  

以上是关于汇编语言 EAX怎么得到EIP的地址?的主要内容,如果未能解决你的问题,请参考以下文章

反汇编查找内存地址

用C语言怎么得到电脑的CPU序列号,硬盘序列号等信息

汇编各寄存器的作用说明

汇编语言寄存器都叫啥?

构造一个缓冲区溢出的C语言的例子,并调试它,使得溢出时EIP的地址为:0x41424344

汇编学习笔记