64位linux下玩32位汇编编程
利用下假期,打算把linux下的汇编语言给熟悉下,结果是以32位为版本的,只能在办公室的机器上跑了个opensuse的32位版本,家里的suse挂了,无法输入中文。打算再安装下32位系统,今天找到了个解决方法,记录如下:
代码如下,文件名位test32.s:
.section .data .section .text .globl _start
_start:
pushl $
pushl $
call sumer
addl $, %esp
movl %eax, %ebx
movl $, %eax
int $0x80 .type sumer, @function sumer:
pushl %ebp
movl %esp, %ebp
movl (%ebp), %eax
movl (%ebp), %ecx
addl %ecx, %eax
popl %ebp
ret
无法按照原来的方式,直接用as test32.s -o test32.o汇编
直接用ld test32.o -o test32链接
直接报错,由于我的linux是64位,解决方法就是在两个命令选项中加上适当的选项即可。
正确的命令是这样的,直接用as test32.s -o test32.o --32 汇编
直接用ld -m elf_i386 test32.o -o test32链接
其中:-m参数是让ld模仿后面跟的连接器,也就是elf_i386格式的连接器,
--32参数是使用32位个是的汇编进行代码汇编,
如果有以下代码test321.c
#include <stdio.h> int factorial(int num){
if( == num){
return ;
}
return num * factorial(num - );
} int main(int argc, char **argv)
{
printf("factorial(5): %d\n", factorial()); return ;
}
在64位系统中,直接使用gcc test321.c -S test321.s,64位汇编代码如下
.file "test321.c"
.text
.globl factorial
.type factorial, @function
factorial:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
subq $, %rsp
movl %edi, -(%rbp)
cmpl $, -(%rbp)
jne .L2
movl $, %eax
jmp .L3
.L2:
movl -(%rbp), %eax
subl $, %eax
movl %eax, %edi
call factorial
imull -(%rbp), %eax
.L3:
leave
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE0:
.size factorial, .-factorial
.section .rodata
.LC0:
.string "factorial(5): %d\n"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
subq $, %rsp
movl %edi, -(%rbp)
movq %rsi, -(%rbp)
movl $, %edi
call factorial
movl %eax, %esi
leaq .LC0(%rip), %rdi
movl $, %eax
call printf@PLT
movl $, %eax
leave
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (GNU) 9.1.0"
.section .note.GNU-stack,"",@progbits
~
在64位系统中,使用gcc test321.c -S -m32 test321.s,32位汇编代码如下
.file "test321.c"
.text
.globl factorial
.type factorial, @function
factorial:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset
.cfi_offset , -
movl %esp, %ebp
.cfi_def_cfa_register
subl $, %esp
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
cmpl $, (%ebp)
jne .L2
movl $, %eax
jmp .L3
.L2:
movl (%ebp), %eax
subl $, %eax
subl $, %esp
pushl %eax
call factorial
addl $, %esp
imull (%ebp), %eax
.L3:
leave
.cfi_restore
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE0:
.size factorial, .-factorial
.section .rodata
.LC0:
.string "factorial(5): %d\n"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
leal (%esp), %ecx
.cfi_def_cfa ,
andl $-, %esp
pushl -(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,
movl %esp, %ebp
pushl %ebx
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x78,0x6
.cfi_escape 0x10,0x3,0x2,0x75,0x7c
call __x86.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_, %ebx
subl $, %esp
pushl $
call factorial
addl $, %esp
subl $, %esp
pushl %eax
leal .LC0@GOTOFF(%ebx), %eax
pushl %eax
call printf@PLT
addl $, %esp
movl $, %eax
leal -(%ebp), %esp
popl %ecx
.cfi_restore
.cfi_def_cfa ,
popl %ebx
.cfi_restore
popl %ebp
.cfi_restore
leal -(%ecx), %esp
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE1:
.size main, .-main
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
.globl __x86.get_pc_thunk.ax
.hidden __x86.get_pc_thunk.ax
.type __x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB2:
.cfi_startproc
movl (%esp), %eax
ret
.cfi_endproc
.LFE2:
.section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
.globl __x86.get_pc_thunk.bx
.hidden __x86.get_pc_thunk.bx
.type __x86.get_pc_thunk.bx, @function
__x86.get_pc_thunk.bx:
.LFB3:
.cfi_startproc
movl (%esp), %ebx
ret
.cfi_endproc
.LFE3:
.ident "GCC: (GNU) 9.1.0"
.section .note.GNU-stack,"",@progbits
linux下命令的选项比命令更重要
64位linux下玩32位汇编编程的更多相关文章
- 在64位linux下编译32位程序
在64位linux下编译32位程序 http://blog.csdn.net/xsckernel/article/details/38045783
- 64位系统下注册32位dll文件
64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...
- 64位系统下注册32位dll、ax文件
64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...
- <摘录>如何在64位linux强制编译32位应用程序
GDC注:因为需要解决在linux64机上编译32位的mongodb(没办法,因为编译的php是32位,然后我想将mongdb扩展添加到php中),在网上搜了很多文章,感觉这篇好懂,而且好用.我使用的 ...
- 64位操作系统下调用32位com的问题
Hello Guys! I am trying to create a simple VBS script to automatically open some .tif images from a ...
- WinDbg 在64位系统下转储32位进程
在64位系统下,首先要判断进程是32位,还是64位 在Win8之前,进程名后带星号(*)则是32位进程.但Win8.1后,则不显示星号.需要选出“平台”列,来确认32位,还是64位. 在64位系统下的 ...
- pyinstaller在64位系统下打包32位程序
使用环境说明:win10 64位,已安装python3.6-64位版本 遇到的问题:win10 64位打包成exe文件后,不能在32位系统运行 需求:使用python打包生成exe文件,win64位和 ...
- 在64位linux上编译32位程序 for i386 intel
编辑中 # ld -V GNU ld version 2.15.92.0.2 20040927 Supported emulations: elf_x86_64 elf_i386 i386linux ...
- 在64位Linux上安装32位gmp大数库
前期准备: 如果没有安装32位gcc和g++环境的话,可能会导致安装失败,此时请参考上一篇博文 http://www.cnblogs.com/weir007/p/5977759.html,根据系统版本 ...
随机推荐
- .htaccess 转 SAE AppConfig
新浪的SAE不支持 htaccess,但是他们开发了 AppConfig,可以完全代替 htaccess 的常见功能,AppConfig采用类自然语言的规则描述,还是很人性化的. 这里来写一个短网址的 ...
- oracle查询十分钟之前的数据
select * from TABLE as of timestamp sysdate - 10/1440 t WHERE ColName='1111'; TABLE:表名 WHERE:查询子句 sy ...
- g++ 生成C++ .so库文件,并调用示例
Tags: g++ C++ so library 在Linux系统下用g++命令编译C++程序.也可以生成so,a链接库 示例一 编译时链接so库 Test.h 文件内容 Main.cpp ...
- 最详细的原生js实现ajax的封装
1. ajax的介绍 1.1 含义 ajax 的全称是Asynchronous JavaScript and XML 简单理解下:ajax就是异步的js和服务端的数据 1.2 组成 异步的js:事件, ...
- 为什么需要 RPC 服务?
链接:https://www.jianshu.com/p/362880b635f0 在传统的开发模式中,我们通常将系统的各个服务部署在单台机器,随着服务的扩展,这种方式已经完全无法满足系统大规模的扩展 ...
- 【SSH学习笔记】浅谈SSH框架
说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...
- IT 界那些朗朗上口的“名言”
中国有很多古代警世名言,朗朗上口,凝聚了很多故事与哲理.硅谷的互联网公司里头也有一些这样的名言,凝聚了很多公司价值观和做事的方法,对于很多程序员来说,其影响潜移默化! Stay hungry Stay ...
- Image Processing and Analysis_8_Edge Detection:Learning to Detect Natural Image Boundaries Using Local Brightness, Color, and Texture Cues ——2004
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- Mount 使用方法
NAME mount - 挂载文件系统 SYNOPSIS 总览 mount [-lhV] mount -a [-fFnrsvw] [-t vfstype] [-O optlist] mount [-f ...
- NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵
https://www.jianshu.com/p/9fe0a7004560 一.简单介绍 LSA和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(d ...