LoginSignup
1
0

More than 3 years have passed since last update.

paizaでアセンブラ その5

Last updated at Posted at 2018-12-06

概要

paizaでアセンブラ、やってみた。
gas調べたら、printf使えた。
fizzbuzzやってみた。

サンプルコード

import subprocess
import os

def gcc():
    c_file = 'fizzbuzz.s'
    test_c = """
.code64
.text
.global main

main:
    sub     $8, %rsp
    mov     $1, %r8
loop:
    mov     $0, %r10
    mov     $0, %rdx
    mov     %r8, %rax
    mov     $3, %rsi
    div     %esi
    cmp     $0, %rdx
    jne     skip1
    add     $1, %r10
skip1:
    mov     $0, %rdx
    mov     %r8, %rax
    mov     $5, %rsi
    div     %esi
    cmp     $0, %rdx
    jne     skip2
    add     $2, %r10
skip2:
    cmp     $0, %r10
    je      printNum
    cmp     $2, %r10
    jb      printFizz
    je      printBuzz
    ja      printFizzBuzz
printNum:
    lea     num(%rip), %rdi
    jmp     loope
printFizz:
    lea     fizz(%rip), %rdi
    jmp     loope
printBuzz:
    lea     buzz(%rip), %rdi
    jmp     loope
printFizzBuzz:
    lea     fizzbuzz(%rip), %rdi
loope:
    mov     $1, %rax
    mov     %r8, %rsi
    push    %r8
    push    %r10
    call    printf
    pop     %r10
    pop     %r8
    add     $1, %r8
    cmp     $101, %r8
    jne     loop
    add     $8, %rsp
    ret
.data
num:
    .asciz "%i "
fizz:
    .asciz "Fizz "
buzz:
    .asciz "Buzz "
fizzbuzz:
    .asciz "FizzBuzz "  
"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    os.system("gcc -no-pie %s" % c_file)
    result = subprocess.Popen('./a.out', stdout = subprocess.PIPE).communicate()[0]
    for i, v in enumerate(result[ : -1].split('\n')):
        print v

if __name__ == '__main__':
  gcc()


成果物

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0