汇编语言脚本:cpuid

简介: 最近在拜读Richard Blum的汇编语言程序设计,记录下学习中的脚本,以及遇到的问题和处理过程

版本1:

#cpuid.s Sample program to extract the processor Vendor ID
  .section .data
output:
  .ascii "The processor Vendor ID is 'xxxxxxxxxxxxxxxxx'\n"
  .section .text
  .global _start
_start:
  mov $0,%eax
  cpuid
  mov $output,%edi
  mov %ebx,28(%edi)
  mov %edx,32(%edi)
  mov %ecx,36(%edi)
  mov $4,%eax
  mov $1,%ebx
  mov $output,%ecx
  mov $42,%edx
  int $0x80
  mov $1,%eax
  mov $0,%ebx
  int $0x80

使用as编译,ld连接:

as -o cpuid.o cpuid.s
ld -o cpuid cpuid.o
./cpuid

图片.png

使用GCC进行汇编,需要修改脚本:将start换成main

#cpuid.s Sample program to extract the processor Vendor ID
  .section .data
output:
  .ascii "The processor Vendor ID is 'xxxxxxxxxxxxxxxxx'\n"
  .section .text
  .global main
main:
  mov $0,%eax
  cpuid
  mov $output,%edi
  mov %ebx,28(%edi)
  mov %edx,32(%edi)
  mov %ecx,36(%edi)
  mov $4,%eax
  mov $1,%ebx
  mov $output,%ecx
  mov $42,%edx
  int $0x80
  mov $1,%eax
  mov $0,%ebx
  int $0x80

使用gcc汇编:

gcc -o cpuid cpuid2.s

但是会报错,错误信息如下:relocation R_X86_64_32 against `.data' can not be used when making a PIE object; recompile with -fPIE


解决方法是:增加-no-pie选项

gcc -o cpuid cpuid2.s -no-pie

图片.png

连接C库函数

#cpuid.s View the CPUID Vendor ID string using C library calls
.section .data
output:
  .asciz "The processor Vendor ID is '%s'\n"
.section .bss
  .lcomm buffer,12
.section .text
.global _start
_start:
  mov $0,%eax
  cpuid
  mov $buffer,%edi
  mov %ebx,(%edi)
  mov %edx,4(%edi)
  mov %ecx,8(%edi)
  push $buffer
  push $output
  call printf
  add $8,%esp
  push $0
  call exit

编译:

as -o cpuid3.o cpuid3.s

连接:

ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid3 -lc cpuid3.o

执行报错,现阶段还不是太熟悉汇编语言,留待后续再解决

图片.png

目录
相关文章
|
6月前
|
存储 机器学习/深度学习 移动开发
汇编语言指令系列
汇编语言指令系列
640 0
|
4月前
|
存储 算法 安全
深入理解汇编语言:基础语法和常用指令介绍
深入理解汇编语言:基础语法和常用指令介绍
|
6月前
|
程序员 存储 安全
【汇编】汇编语言的介绍
【汇编】汇编语言的介绍
123 0
【汇编】汇编语言的介绍
|
安全 Java 大数据
汇编语言的不同
汇编语言的不同
75 0
|
存储 安全 程序员
5.1 汇编语言:汇编语言概述
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。相较于高级语言(如C、Python等),汇编语言学习和使用难度相对较大,需要对计算机内部结构、指令集等有深入的了解,以及具有良好的编程习惯和调试能力。但对于需要对计算机底层进行操作的任务,汇编语言是极其高效的,因为其可以实现对计算机底层资源的精细控制,极大地提高了计算机运行效率。
125 0
|
存储 自然语言处理 Java
汇编语言学习 下
汇编语言学习笔记 下
134 1
汇编语言学习 下
|
编译器 C语言 数据安全/隐私保护
汇编语言和本地代码及通过编译器输出汇编语言的源代码
汇编语言和本地代码及通过编译器输出汇编语言的源代码
110 0
|
存储 JavaScript
汇编语言的所有指令
汇编语言的所有指令
|
存储 编译器
一片文章带你了解汇编语言
一片文章带你了解汇编语言
208 0
一片文章带你了解汇编语言
|
缓存 前端开发 rax
汇编语言(2)
汇编语言 向屏幕输出文字 向屏幕输出需要向显示缓冲区写数据(在dosbox中在内存的其实位置是0b800h:0000h) 输出的一个字符其实占用的是两个字节(一个字单位), 因为我们不仅要输出一个8位的ASCII, 还要输出该字符的属性, 包括高亮, 颜色, 底色等, 这些有另一个8位决定, 通过...
837 0