当前位置: 代码迷 >> 汇编语言 >> 请问一个64位的at&t汇编程序
  详细解决方案

请问一个64位的at&t汇编程序

热度:523   发布时间:2016-05-02 04:57:15.0
请教一个64位的at&t汇编程序
哪位大侠帮忙调试一段代码.

原代码是<professional assembly language>第4.4节"Using C Library Functions in Assembly"中的示例.

我的开发环境是64位, 不能直接用.
做了一些修改, 能够编译连接通过, 但是没有输出内容..

环境如下:
操作系统: Linux linux.centos 2.6.32-279.5.2.el6.x86_64 #1 SMP Fri Aug 24 01:07:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
汇编器: GNU assembler version 2.20.51.0.2 (x86_64-redhat-linux) using BFD version version 2.20.51.0.2-5.34.el6 20100205
连接器: GNU ld version 2.20.51.0.2-5.34.el6 20100205

汇编及连接使用的命令:
as ex.004.003.cpuid.s -gstabs -o cpuid.o && ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc cpuid.o -o cpuid

下面是我的修改后的代码:

#.asciz定义的字符串会自动追加末尾的\0字节
.section    .data
output:
    .asciz  "The processor Vendor ID is '%s'\n"

.section    .bss
    #定义未经初始化的缓冲区
    .lcomm  buffer, 18

.section    .text
.globl  _start
_start:
    #设置cpuid指令的标志, 读取厂商信息
    movl    $0, %edi
    #执行cpuid指令
    cpuid
    #将cpuid的输出(ebx, edx, ecx)中读取到$buffer中
    movl    $buffer, %edi
    movl    %ebx, (%edi)
    movl    %edx, 4(%edi)
    movl    %ecx, 8(%edi)
    #将$buffer放入到调用栈
    pushq   $buffer
    #将$output放入到调用栈
    pushq   $output
    #调用系统库函数printf
    call    printf
    #清空为printf函数放入堆栈的参数
    addq    $16, %rsp
    pushq   $0  
    call    exit


Thanks in advance!

------解决方案--------------------
我只会intel格式的汇编,看不懂
不过关于输出的问题就看看自己有没在字符串后面加,NULL
有没用UNICODE

------解决方案--------------------
x64位不只是改语法那么简单,还有构架。