64位linux下如何将两个32位的汇编文件编译为一个不含格式的纯二进制文件

现在有个需求,在64位linux下将一个c语言文件和一个intel格式汇编语言文件一起编译为一个32位无格式二进制文件,下面是我找到的方法。

解决方法

对c语言文件作如下处理

gcc ccode.c -m32 -S -o ccode.s

然后将得到的汇编文件与机器语言无关的伪代码删掉,并删除这行代码

addl    $_GLOBAL_OFFSET_TABLE_, %eax

接着用as命令将修改后的汇编代码编译为目标文件

as ccode.s -o ccode.o --32

对intel语法的汇编文件,使用nasm处理

nasm -f elf32 acode.asm -o acode.o

最后运行ld命令将两个目标文件连接起来并取其无格式二进制机器码部分

ld --oformat binary -o exec.bin acode.o ccode.o -e 0 -m elf_i386

得到的exec.bin便是所需的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在8086环境下用汇编语言编写、输入一个32位二进制数相加程序的代码: ``` .model small .stack 100h .data msg db 'Enter a 32-bit binary number: $' result db 'The sum is: $' num1 db 32 dup('$') num2 db 32 dup('$') sum db 33 dup('$') .code main proc mov ax, @data mov ds, ax ; Input first 32-bit binary number mov ah, 9 lea dx, msg int 21h mov ah, 0Ah lea dx, num1 int 21h ; Input second 32-bit binary number mov ah, 9 lea dx, msg int 21h mov ah, 0Ah lea dx, num2 int 21h ; Convert binary numbers to decimal call binToDec mov bx, ax call binToDec add bx, ax ; Convert sum to binary mov cx, 32 ; Counter for loop mov di, offset sum ; Offset for sum array mov ax, bx ; Result in AX mov bx, 2 ; Binary base mov dx, 0 ; Clear DX sumLoop: div bx ; Divide by 2 add dl, '0' ; Convert remainder to ASCII mov [di], dl ; Store in sum array dec di ; Decrement offset dec cx ; Decrement counter cmp cx, 0 ; Check if done jne sumLoop ; Output sum in binary mov ah, 9 lea dx, result int 21h mov ah, 9 lea dx, sum int 21h mov ah, 4ch ; Return control to DOS int 21h main endp ; Convert binary number in num1 to decimal ; Result in AX binToDec proc xor ax, ax ; Clear AX mov cx, 32 ; Counter for loop mov si, offset num1 ; Offset for num1 array binLoop: mov dl, [si] ; Get next character in num1 sub dl, '0' ; Convert to decimal mov bx, 2 ; Binary base mul bx ; Multiply by base (2) add ax, dx ; Add remainder inc si ; Increment offset dec cx ; Decrement counter cmp cx, 0 ; Check if done jne binLoop ret binToDec endp end main ``` 这个程序会要求用户输入两个32位二进制数,然后将它们相加,最后输出结果。程序首先将输入的二进制数转换为十进制,然后将它们相加得到结果。最后,程序将结果转换为二进制并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值