利用下假期,打算把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位汇编编程的更多相关文章

  1. 在64位linux下编译32位程序

    在64位linux下编译32位程序 http://blog.csdn.net/xsckernel/article/details/38045783

  2. 64位系统下注册32位dll文件

    64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...

  3. 64位系统下注册32位dll、ax文件

    64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...

  4. <摘录>如何在64位linux强制编译32位应用程序

    GDC注:因为需要解决在linux64机上编译32位的mongodb(没办法,因为编译的php是32位,然后我想将mongdb扩展添加到php中),在网上搜了很多文章,感觉这篇好懂,而且好用.我使用的 ...

  5. 64位操作系统下调用32位com的问题

    Hello Guys! I am trying to create a simple VBS script to automatically open some .tif images from a ...

  6. WinDbg 在64位系统下转储32位进程

    在64位系统下,首先要判断进程是32位,还是64位 在Win8之前,进程名后带星号(*)则是32位进程.但Win8.1后,则不显示星号.需要选出“平台”列,来确认32位,还是64位. 在64位系统下的 ...

  7. pyinstaller在64位系统下打包32位程序

    使用环境说明:win10 64位,已安装python3.6-64位版本 遇到的问题:win10 64位打包成exe文件后,不能在32位系统运行 需求:使用python打包生成exe文件,win64位和 ...

  8. 在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 ...

  9. 在64位Linux上安装32位gmp大数库

    前期准备: 如果没有安装32位gcc和g++环境的话,可能会导致安装失败,此时请参考上一篇博文 http://www.cnblogs.com/weir007/p/5977759.html,根据系统版本 ...

随机推荐

  1. java 框架-分布式文件管理系统1FastDFS

    https://www.cnblogs.com/chiangchou/p/fastdfs.html

  2. jQuery组件封装之return this.each(function () {});

    记录一下自己的调试历程 组件封装经常看到这么一段代码 $.fn.plugin = function (options) { return this.each(function (i,t) { new ...

  3. ubuntu下使用libsvm

    matlab上的代码已经八八九九了,因为涉及到GUI和网络编程的东西,所以不得已开始学python并在python上做完整版. 下面是如何在linux和python下使用libsvm 在你的pytho ...

  4. 定义Java类实现字节流转字符流

    package com.buaa.comparable; import java.io.BufferedReader;import java.io.File;import java.io.FileIn ...

  5. strconv:各种数据类型和字符串之间的相互转换

    介绍 strconv包实现了基本数据类型和其对应字符串之间的相互转换.主要有一下常用函数:Atoi,Itoa,Parse系列,Formart系列,Append系列 string和int之间的转换 这一 ...

  6. Nginx,Haproxy/lvs负载均衡的优缺点分析

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  7. idou老师教你学Istio 22 : 如何用istio实现调用链跟踪

    大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等一些功能. 每一个功能都帮助我们在不同场景中实现不同的业务.那么其中比如流量监控这种复杂的功能Istio是如何让我们在不同的应用中实现 ...

  8. python中的几种数据类型(一)

    一.整型(数字)      python2中有长整形long      python3 中全都是整型 int n = 56 print(n.bit_length()) # 0011 1000 # 12 ...

  9. WCF学习笔记二

    客户端调用WCF服务出现以下错误: “/”应用程序中的服务器错误. 远程服务器返回错误: (415) Unsupported Media Type. 说明: 执行当前 Web 请求期间,出现未经处理的 ...

  10. GET 和 POST is so different

    .原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式. HTTP定义了与服务器交互的 ...