第二章 at&t 汇编语言

Click here to load reader

Upload: suchin

Post on 11-Jan-2016

321 views

Category:

Documents


1 download

DESCRIPTION

第二章 AT&T 汇编语言. 提纲. AT&T 汇编语言 GCC 内嵌汇编. AT&T 汇编语言. 在 Linux 中,以 .S( 或 .s) 为扩展名的文件是包含汇编语言代码的文件。 在 Linux 下有两种方式对 AT&T 汇编进行编译链接,一种是使用汇编程序 GAS 和连接程序 LD ,一种是使用 GCC. AT&T 汇编的编译方式. 使用汇编程序 GAS 和连接程序 LD 第一步: as sourcecode.s -o objfile.o 将汇编源文件编译成目标文件 第二步: ld objfile.o -o execode - PowerPoint PPT Presentation

TRANSCRIPT

  • AT&T

  • AT&TGCC

  • AT&TLinux.S(.s)LinuxAT&TGASLDGCC

  • AT&TGASLD as sourcecode.s -o objfile.o ld objfile.o -o execode GCC gcc -o execode sourcecode.S GCC

  • AT&T.dataoutput: .ascii "hello world\n".text.globl _start_start: movl $4, %eax movl $1, %ebx movl $output, %ecx movl $12, %edx int $0x80 movl $1, %eax int $0x80 linuxhello worldAT&TIntel

  • AT&T(Section) AT&T.section .data .text

  • AT&T(Section).bss0 .bss.data.bss .bss

  • AT&T.dataoutput: .ascii "hello world\n".text.globl _start_start: movl $4, %eax movl $1, %ebx movl $output, %ecx movl $12, %edx int $0x80 movl $3, %eax movl $1, %ebx movl $sentence, %ecx movl $30, %edx int $0x80 movl $4, %eax movl $30, %edx int $0x80 movl $1, %eax int $0x80.bss sentence: .fill 30 hello world

  • AT&T.ascii .asciistring . ascii ()(\0) .asciz \0.fill .fill repeat , size , value sizerepeat sizevalue10

  • AT&T.globl .globl symbol .globl(ld)symbolsymbolsymbol.rept endr .rept count . .endr .rept.endrcount

  • AT&T.space .space size , fill sizefill .byte/.word/.long .byte/.word/.long expressions 1//expressionexpression// .set C#define

  • AT&T Intel AT&TIntel

    AT%T"%eax""%ebx""%""$8""$0xffff""$"

  • AT&T Intel /

    IntelAT&T

  • AT&T Intel Intelsegreg[base+index*scale+disp]AT&T%segregdisp(base,index,scale)

    AT&Tscale/disp$scale,disp&Intel[]AT&T()

  • AT&T Intel AT&Tlljmplcalllret

  • AT&T Intel AT&Tl32w16b8Intelbyte ptr word ptr,dword ptrdwordlong

  • GCC LinuxCGCCC

  • asm(statements); asm__volatile__ __asm__ __volatile__("hlt");

  • \n\t asm( "pushl %eax\n\t" "movl $0,%eax\n\t" "popl %eax"); asm("movl %eax,%ebx"); asm("xorl %ebx,%edx"); asm("movl $0,_booga);

  • CCCC GCC

  • CGCC __asm__ __violate__ ("movl %1,%0" : "=r" (result) : "r" (input)); movl %1,%0%0%1=rC inputinputresult

  • __asm__ __volatile__ ("movl %1,%0" : "=m" (result) : "m" (input));=r=mrmrm

  • __asm__( : : : );asm ( "statements" : output_regs : input_regs : clobbered_regs)

  • ::int main(void){ int dest; int value=1; asm( "movl %1, %0" : "=a"(dest) : "c" (value) : "%ebx"); printf("%d\n", dest); return 0;}

  • ;\n\n\tC10%0%1%9long4%bh%h1

  • C=__asm__ __volatile__ ("pushfl ; popl %0 ; cli":"=g" (x) ) xC=g

  • CC __asm__ __volatile__ ("lidt %0" : : "m" (real_mode_idt));

  • CC

  • 1 int main(void) { int result = 2; int input = 1; __asm__ __volatile__ ("addl %1, %0": "=r"(result): "r"(input)); printf("%d\n", result); return 0; } 1+2=3inputresultresult%1%0inputresult=rr=result2

  • (objdump -j .text S )GCCAT&T movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) movl 0xfffffff8(%ebp),%eax addl %eax,%eax movl %eax,0xfffffffc(%ebp)

    resultinputinputGCC%eaxaddl%eaxinputinputaddladdl %eax,%eax

  • rGCCrGCCGCCGCC addlresult

  • int main(void) { int result = 2; int input = 1; __asm__ __volatile__ ("addl %2,%0":"=r"(result):"r"(result),"m"(input)); printf("%d\n", result); return 0; } AT&T movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) movl 0xfffffffc(%ebp),%eax addl 0xfffffff8(%ebp),%eax movl %eax,0xfffffffc(%ebp)

  • %0%1resultGCCeax3%0%1 int main(void) { int result = 2; int input = 1; __asm__ __volatile__ ("addl %2,%0":"=r"(result):"0"(result),"m"(input)); printf("%d\n", result); return 0; } 0%0%1

  • 2 int main(void) { int count=3; int value=1; int buf[10]; asm( "cld \n\t" "rep \n\t" "stosl" : : "c" (count), "a" (value) , "D" (buf) ); printf("%d %d %d\n", buf[0],buf[1],buf[2]); } GCCAT&Tmovl 0xfffffff4(%ebp),%ecxmovl 0xfffffff0(%ebp),%eaxlea 0xffffffb8(%ebp),%edicld repz stos %eax,%es:(%edi) countvaluebufCcaDECXEAXEDIcld rep stosl%ecx%edibufcountvalue

  • 3 int main(void) { int input, output, temp; input = 1; __asm__ __volatile__ ("movl $0, %%eax;\n\t" "movl %%eax, %1;\n\t" "movl %2, %%eax;\n\t" "movl %%eax, %0;\n\t" : "=m" (output), "=m"(temp) : "r" (input) :"eax"); printf("%d %d\n", temp,output); return 0; }

  • GCC movl $0x1,0xfffffffc(%ebp) mov 0xfffffffc(%ebp),%edx mov $0x0,%eax mov %eax,0xfffffff4(%ebp) mov %edx,%eax mov %eax,0xfffffff8(%ebp)

    inputoutputtempoutputtemp=minputr1inputedxeaxeaxeaxedx