다른 시스템의 어셈블리 언어
어셈블리어
어셈블리 언어는 기계어를 상징적으로 표현한 것입니다. 따라서 아키텍처에 따라 다릅니다.
각 명령어는 로드 레지스터의 경우 "LDR", 이동의 경우 "MOV"또는 곱셈의 경우 "MUL"과 같은 짧은 니모닉 단어로 표시되며 뒤에 인수(선택 사항)가 표시됩니다. 주소 지정 모드는 인수의 형식에 의해 암시됩니다. 서로 다른 어셈블러는 약간 다른 구문을 사용합니다.
x86
다음은 "Hello, World!"입니다. Nasm 구문을 사용하여 Linux 시스템용 x86 어셈블러에서 프로그램:
section .text
global _start
_start:
mov edx,len ; message length (bytes)
mov ecx,msg ; message location (memory address)
mov ebx,1 ; file descriptor: 1 is stdout
mov eax,4 ; kernel syscall number: 4 is sys_write
int 0x80 ; invoke syscall
mov ebx,0 ; exit status: 0 (good)
mov eax,1 ; kernel syscall number: 1 is sys_exit
int 0x80 ; invoke syscall
section .rodata
msg db 'Hello, world!\n'
len equ $ - msg
다음은 GNU 어셈블러(gas/as) 구문을 사용하는 동일한 프로그램입니다.
.text
.globl _start
_start:
mov $len, %edx /* file descriptor: 1 is stdout */
mov $msg, %ecx /* message location (memory address) */
mov $1, %ebx /* message length (bytes) */
mov $4, %eax /* write is syscall #4 */
int $0x80 /* invoke syscall */
mov $0, %ebx /* exit status: 0 (good) */
mov $1, %eax /* kernel syscall number: 1 is sys_exit */
int $0x80 /* invoke syscall */
.data
msg:
.ascii "Hello, World!\n"
len = . - msg
두 어셈블러 사이에서 일부 줄의 인수 순서가 바뀌고 기호 및 값에 대한 접두사도 변경됩니다.
ARM(32비트)
이것은 GNU 어셈블러(gas/as) 구문으로 작성되었습니다.
.text
.globl _start
_start:
mov %r0, $1 /* file descriptor: 1 is stdout */
ldr %r1, =msg /* message location (memory address) */
ldr %r2, =len /* message length (bytes) */
mov %r7, $4 /* write is syscall #4 */
swi $0 /* invoke syscall */
mov %r0, $0 /* exit status: 0 (good) */
mov %r7, $1 /* kernel syscall number: 1 is sys_exit */
swi $0 /* invoke syscall */
.data
msg:
.ascii "Hello, world!\n"
len = . - msg
Resources
결론
⚠️ 어셈블러 기본 사항 블로그 게시물:
연결
🖇 팔로우GitHub
🖇 팔로우
_p.s 이 게시물은 내 소프트웨어 이식성 및 최적화 수업을 위해 작성되었습니다.
Reference
이 문제에 관하여(다른 시스템의 어셈블리 언어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/serputov/assembly-language-on-different-machines-ijc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)