随笔分类 - Assembly

关于汇编语言的文章
rep stos dword ptr es:[edi] 是做什么的?
摘要:笔者在winDBG中反汇编一个小程序的main函数, 看到了如下的一段代码: 0:000> uf . monitor!main [c:\users\myalias\documents\visual studio 2005\projects\mytest\mytest\main.c @ 32]: 32 0042f780 55 push ... 阅读全文

posted @ 2012-08-05 09:39 中道学友 阅读(9711) 评论(0) 推荐(0) 编辑

Quiz- Win32内存表示与数值大小
摘要:问题 在VS2010的memory窗口中查看地址为0x00635878内存, 如图. 如果我一直该地址的内存存储的值是一个指针, 那么该指针的值是多少? A. 40b4ca74 B. 47ac4b04 C. 74cab440 D. 044bac47 答案 C. 74cab440 这里涉及到了一个little endian的概念. These two phr... 阅读全文

posted @ 2012-08-02 11:44 中道学友 阅读(255) 评论(0) 推荐(0) 编辑

如何在Visual Studio中运行和调试汇编代码?
摘要:最简单的方法, 就是在VS2010的C++文件里直接使用__asm{} 直接写汇编代码. 实例代码如下:#include <iostream>using namespace std;int main(){ char a[10] = "1234"; __asm { push eax push edx push ecx lea eax, a mov cl,byte ptr [eax] mov dl,byte ptr [eax] movzx ecx,cl ... 阅读全文

posted @ 2012-07-27 11:56 中道学友 阅读(22434) 评论(0) 推荐(0) 编辑

X64 Calling Convention 的一个实验
摘要:很久没更新blog了, 最近比较忙. 这篇文章转自我的onenote, 所以中英文都有, 记给自己, 也分享给大家. 没必要纠结语言, 能看懂就行了. 呵呵.以下结论非常重要, 摘自<<Advanced Windows Debugging>> Page 606. Rcx: contains the 1st parameter passed to the function. Rdx: contains the 2nd parameter passed to the function. R8: contains the 3rd parameter passed to the 阅读全文

posted @ 2012-06-05 15:49 中道学友 阅读(1211) 评论(0) 推荐(0) 编辑

Move EDI, EDI的作用
摘要:玩WinDBG的时候, 发现函数的反汇编代码的最开始部分总是包含一条move edi, edi的指令. 比如下面的代码生成汇编代码的开头部分如下:Push EBP和Mov EBP, ESP两条指令是标准的栈框架建立的指令, 但是Mov EDI, EDI是做什么的呢? 看起来它就是两个字节的NOP指令.正解:mov edi, edi的确是个双字节的no-op指令, 它存在的目的是使得hot-patc... 阅读全文

posted @ 2011-01-01 18:10 中道学友 阅读(2666) 评论(0) 推荐(0) 编辑

伪寄存器
摘要:许多寄存器的名字取决于处理器的架构, 因此对于那些偶尔使用调试器的用户来说很难记住所有平台上的寄存器名字. 为了克服这个问题, 调试器的开发团队引入了各种伪寄存器(Pseudo-Register), 由调试器将这些伪寄存器对应到不同的硬件架构上. 所有的伪寄存器都由一个美元符号($)开始. 如果你使用MASM语法, 你可以在$符号之前添加一个@符号, 这个@字符会告诉debugger接下来的tok... 阅读全文

posted @ 2011-01-01 13:44 中道学友 阅读(1059) 评论(0) 推荐(0) 编辑

DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器
摘要:DS is called data segment register. It points to the segment of the data used by the running program. You can point this to anywhere you want as long as it contains the desired data. DS叫做段寄存器, 指向当前运行着的程序的数据段. 你可以把它指向任何你想要的地方, 只要那个地方有你想要的数据. ES is called extra segment register. It is usually used wi. 阅读全文

posted @ 2010-07-07 11:19 中道学友 阅读(12024) 评论(1) 推荐(0) 编辑

X64 Debugging汇编点滴
摘要:32位与64位最主要的区别就是多了八个geneal的寄存器R8,R9,R10,R11...R15. 其他还有, 通用寄存器不再以E开头, 取而代之的是字母r. 比如说, EAX现在是rAX. 阅读全文

posted @ 2010-01-27 13:11 中道学友 阅读(387) 评论(0) 推荐(0) 编辑

寄存器使用惯例
摘要:在给定的时刻只能有一个过程是活动的, 它占使用CPU的程序寄存器组. 程序寄存器组作为一个单个资源被所有的函数过程共享.  所以, 我们必须保证: 一个过程(调用者)调用另一个(被调用者)时, 被调用者不会覆盖某个调用者稍后会使用到的寄存器的值.   为此, IA32(俗称x86)采用了一组统一的寄存器使用惯例., 所有的过程调用都必须遵守, 包括程序库中的过程. ... 阅读全文

posted @ 2009-11-17 21:35 中道学友 阅读(1539) 评论(0) 推荐(0) 编辑

在IA32如何将程序计数器的值放入到整数寄存器中?
摘要:    call next next:     pop1 %eax   这是一个汇编代码的习惯用法. 刚开始它看起来很奇怪 call指令并没有与之匹配的ret. 然后我们就意识到它根本就不是一个真正的过程调用.   寄存器%eax被设置成了什么值? 答: %eax被设置成了popl指令的地... 阅读全文

posted @ 2009-11-17 21:16 中道学友 阅读(865) 评论(0) 推荐(0) 编辑

汇编程序中的返回值
摘要:有的函数是有返回值的, 有的是int, 有的是string, 有的是结构体等等.   然而, 对于汇编程序来说, 返回值的类型只有一种dword型, 它永远放在eax中.   如果要返回的内容不是一个eax所能容纳的,Win32 API采用的方法一般是返回一个指针,或者在调用参数中提供一个缓冲区地址,干脆把数据直接返回到缓冲区中去。     &... 阅读全文

posted @ 2009-11-15 10:01 中道学友 阅读(3950) 评论(0) 推荐(0) 编辑

Win32汇编中, 段的定义和概念
摘要:Win32的汇编源程序中,包含全部段的源程序结构如下: .386.model flat,stdcalloption casemap:none <一些include语句>.stack [堆栈段的大小].data <一些初始化过的变量定义>.data? <一些没有初始化过的变量定义>.const <一些常量定义>.code <代码> <... 阅读全文

posted @ 2009-11-15 09:42 中道学友 阅读(2504) 评论(0) 推荐(0) 编辑

快速识别汇编中等价的C语言语句(if, while, for, switch)
摘要:可能经常看汇编的朋友会一眼就认出跟C语言中一些语句等价的汇编代码, 经验使然也. 而不经常接触汇编的同学, 可能就对相对繁琐的寄存器操作指令有点云里雾里了. 汇编是编译器翻译中级语言(也可以把C语言称作高级语言, 呵呵)的结果, 只要是机器做的事儿,一般都有规律可循. 那我们现在就来看看一下这些基本语句的汇编规律吧. 注意:本文使用的汇编格式为GAS(Gnu ASembler GNU汇编器). ... 阅读全文

posted @ 2009-11-11 11:24 中道学友 阅读(5897) 评论(0) 推荐(2) 编辑

AT&T汇编格式与Intel汇编格式的比较
摘要:GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gnu ASembler GNU汇编器), 而微软采用Intel的汇编格式. 一 基本语法 语法上主要有以下几个不同. 1、寄存器命名原则 AT&T Intel 说明 %eax eax Intel的不带百分号 2、源/目的操作数顺序 AT&T Intel 说明 movl %eax, %ebx mov ebx, eax In... 阅读全文

posted @ 2009-11-11 10:58 中道学友 阅读(4745) 评论(0) 推荐(0) 编辑

neg eax sbb eax, eax
摘要:今天下午看一个反汇编的代码,并试图跟源代码对上号。 下面的语句组合让我非常费解,花了好久才弄清楚。贴出来,供大家参考。         neg     r         sbb   &... 阅读全文

posted @ 2009-11-06 15:56 中道学友 阅读(4533) 评论(0) 推荐(0) 编辑

详解LEA指令
摘要:初学汇编,可能对LEA指令很迷惑。关于LEA指令,下面的文章写的很好。   比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: push   ebp   mov   esp,   ebp   sub   ... 阅读全文

posted @ 2009-11-06 15:34 中道学友 阅读(7354) 评论(0) 推荐(0) 编辑

汇编语言基础之九- 关于栈指针的规律性的总结
摘要:栈底指针可以被用来判断传递的参数的值,还有函数的局部变量的值。让我们继续用上一个例子来说明一下吧。 ChildEBP RetAddr 0012ff34 00401121 Simple!Foo2+0x64 [C:\Labfiles\Module04\Simple\Simple.cpp @ 82] 0012ff4c 004010da Simple!Foo1+0x31 [C:\Labfiles\Module04\Simple\Simple.cpp @ 65] 0012ff64 00401096 Simple!Foo+0x2d [C:\Labfiles\Module04\Simpl... 阅读全文

posted @ 2009-11-06 11:01 中道学友 阅读(1561) 评论(0) 推荐(0) 编辑

汇编语言基础之八- 动手练习,将前面的知识用于实践
摘要:本文中,先介绍了自己动手使用windbg的流程,然后用详细的说明带着读者一起动手,来观察一下调用栈。 阅读全文

posted @ 2009-11-04 16:05 中道学友 阅读(917) 评论(0) 推荐(0) 编辑

汇编语言基础之七- 框架指针的省略(FPO)
摘要:介绍了什么是FPO-Frame Pointer Omission。 阅读全文

posted @ 2009-11-04 15:29 中道学友 阅读(3234) 评论(1) 推荐(0) 编辑

汇编语言-指令格式
摘要:记得前面提到过这个问题,几句话就给带过了。为什么还要啰里啰嗦的再说一下呢? 呵呵,是这样的,我在看一本汇编的资料时,怀疑上面的一个语句弄错了。想知道是不是他的汇编指令代码里包含“印刷错误”。我想如果是印刷错误的话,很可能他的二进制代码跟看得懂的指令码对不上。那么我如何自己将那个二进制代码转换成汇编指令码呢?   语句如下:00401046 51 push ecx ; make ro... 阅读全文

posted @ 2009-11-02 08:24 中道学友 阅读(1975) 评论(0) 推荐(0) 编辑

导航

技术追求准确,态度积极向上