64비트 어셈블리 언어: Aarch64 VS. X84_64

4656 단어
이 블로그 게시물에서 x86_64 및 aarch64 서버에서 어셈블러를 사용한 실험에 대해 읽을 수 있습니다.

어셈블러 언어 지침을 본 적이 없다면 여기 이 실습을 위한 Aarch64 시스템용 소스 코드가 있습니다.

아크64




.text
.globl _start

min = 0                          /* starting value for the loop index; note that this is a symbol (constant), not a variable */
max = 31                         /* loop exits when the index hits this number (loop condition is i<max) */

_start:

        mov     x19, min
        mov     x17, 10

loop:
        mov     x0, 1           /* file descriptor: 1 is stdout */
        adr     x1, msg         /* message location (memory address) */
        mov     x2, len         /* message length (bytes) */

        mov     x18, x19        /*mov x19 into x18 */
        udiv    x9, x18, x17
        add     x13, x9, 0x30
        msub    x10, x9, x17, x18 /*get remainder*/
        add     x14, x10, 0x30
        adr     x15, msg
        strb    w13, [x15, 13]

        strb    w14, [x15, 14]
        mov     x8, 64          /* write is syscall #64 */
        svc     0               /* invoke syscall */

        add     x19, x19, 1
        cmp     x19, max
        b.ne    loop

.data

msg:    .ascii      "Hello, World  #\n"
len=    . - msg


이것은 특정server에서 이 코드를 빌드하는 방법입니다.


이것은 소스 코드의 출력입니다.

지금 이스라엘 서버에서 내 나무가 어떻게 보이는지 관심 있는 분들을 위해.

X84_64



다음은 거의 동일한 코드이지만 다른 시스템에 대한 것입니다.

/* 
   This is a 'hello world' program in x86_64 assembler using the 
   GNU assembler (gas) syntax. Note that this program runs in 64-bit
   mode.

   CTyler, Seneca College, 2014-01-20
   Licensed under GNU GPL v2+
*/

.text
.globl  _start


_start:

        movq     $0, %r15                        /* Loop counter */
        movq     $0x30, %r12                     /* value of 0 in Ascii */

loop:
        movq     $0, %rdx                        /* clearing reminder for division */
        movq     %r15, %rax                      /* set rax to be divide */
        movq     $10, %r10                       /* set divisor */
        div      %r10                            /* divide */
        movq     %rax, %r14                      /* store quotient */
        movq     %rdx, %r13                      /* store remainder */

        add      $0x30, %r14                     /* quotient to ascii */
        add      $0x30, %r13                     /* remainder to ascii */
        mov      %r13b, msg+14                   /* Modify 1 byte inmsg with remainder */

        cmp      %r12, %r14
        mov      %r14b, msg+13                   /* Modify 1 byte in msg with quotient */

        movq     $len, %rdx                      /* message length */
        movq     $msg, %rsi                      /* message location */
        movq     $1, %rdi                                /* file descriptor stdout */
        movq     $1, %rax                                /* syscall sys_write */
        syscall

        inc     %r15                            /* increment counter */
        cmp     $31, %r15                               /* see if we're done */
        jne     loop                            /* if not, loop */

        movq     $0, %rdi                                /* exit status */
        movq     $60, %rax                       /* syscall sys_exit */
        syscall

.section .data

        msg:    .ascii   "Hello World:   \n"
        len = . - msg

~             


다른 서버에서.



결론



⚠️ 컴퓨터 아키텍처 블로그 게시물: 링크

연결



🖇 팔로우GitHub

🖇 팔로우

_p.s 이 게시물은 내 소프트웨어 이식성 및 최적화 수업을 위해 작성되었습니다.

좋은 웹페이지 즐겨찾기