最新学习代码优化,看了很多反编译的汇编代码,意识到自己的汇编水平比较烂,重新学习下汇编编程。各位看官看我第一个例子就知道我学习用的书是《Professional Assembly Language》。 这本书通俗易懂,我很喜欢。
cpuid 指令可以获取cpu的一些信息,对于这个指令比较感兴趣的可以查看intel的Manual。下面这段代码完全来自 Richard Blum大牛的book,(不知道算不算侵犯版权,我估计他不会和我这个对他无限仰望的菜鸟计较。)
解释下代码,cpuid指令有很多中,DOS编程技术有详细的介绍,根据eax中的数值不同,cpuid指令返回不同的信息。当eax中的值为0的时候,cpuid指令获取的是 Vendor ID。这条指令执行完毕后:
EAX -------------要求基本信息时,eax功能码的最大值。 换句话说,如果eax 的值大于了最大值,cpuid不能识别这条指令,无法返回信息
EBX EDX ECX ------返回Vendor ID的字符表示
看下下面的调试结果: 可以看到 eax中保存的值为11,表示最大功能码是11,如果将大于11的数字存入eax,然后调用cpuid,则不能识别。
- (gdb) info reg
- eax 0xb 11
- ecx 0x6c65746e 1818588270
- edx 0x49656e69 1231384169
- ebx 0x756e6547 1970169159
- esp 0xbffff7e0 0xbffff7e0
- ebp 0x0 0x0
- esi 0x0 0
- edi 0x0 0
- eip 0x804807c 0x804807c <_start+8>
- eflags 0x200212 [ AF IF ID ]
- cs 0x73 115
- ss 0x7b 123
- ds 0x7b 123
- es 0x7b 123
- fs 0x0 0
- gs 0x0 0
下面讲述生成可执行文件的命令:执行完后,可以看到生成了可执行文件cpuid。
- as -o cpuid.o cpuid.s
- ld -o cpuid cpuid.o
执行cpuid可以看到输出。
- root@libin:~/program/assembly# ./cpuid
- the processor vendor ID is 'GenuineIntel'
另外一种生成可执行文件的方法是使用gcc。由于gcc需要寻找main,所以汇编代码中的_start 需用main来代替。
我们知道,C程序如果生成debug版本,需要加上-g选项,汇编同样道理,只需要执行,下面命令,即可生成debug版本的可执行程序。
然后我们就可以像调试C程序一样调试汇编程序了。
- as -gstabs -o cpuid.o cpuid.s
- ld -o cpuid cpuid.o
- # cpuid.s extract the the processor vendor ID
- .section .data
- output:
- .ascii "the processor vendor ID is 'xxxxxxxxxxxx'\n"
- .section .text
- .global _start
- _start:
- nop
- movl $0,%eax
- cpuid
- movl $output, %edi
- movl %ebx,28(%edi)
- movl %edx,32(%edi)
- movl %ecx,36(%edi)
- movl $4,%eax
- movl $1,%ebx
- movl $output,%ecx
- movl $42,%edx
- int $0x80
- mov $1,%eax
- mov $0,%ebx
- int $0x80
阅读(1666) | 评论(0) | 转发(0) |