어셈블리 언어로 Hello, World!

9705 단어 VagrantassemblyRuby

어셈블리 언어로 Hello, World!


어셈블리 언어로 Hello World!에서 설명한 대로 해당 매개변수의 값을 수정합니다.예제 프로그램은 여기 입니다.

개발 환경

  • Vagrant를 개발 환경에 설치하십시오.
  • Vagrant의 boxhttp://files.vagrantup.com/precise32.box를 precise32의 이름으로 로컬에 배치합니다.
    이 Vagrant의 상자를 로컬에 다시 배치하려면 다음 명령을 수행합니다.
  • vagrant box add precise32 http://files.vagrantup.com/precise32.box
    

    항목 만들기


    프로젝트의 루트 디렉토리를 만들고 예제 프로그램에서 다음 파일을 복사합니다.
  • Vagrantfile
  • bootstrap.sh
  • Vagrant 사용


    가상 머신을 시작하려면 다음 명령을 수행합니다.시작 시 bootstrap.sh 필요한 패키지가 실행되고 설치됩니다.
    vagrant up
    
    가상 시스템에 연결하려면 다음 명령을 수행합니다.
    vagrant ssh
    
    가상 작업을 중지하려면 다음 명령을 수행합니다.
    vagrant halt
    

    필요한 소프트웨어 패키지 설치

    vagrant up VM을 시작하면 다음 패키지가 자동으로 설치됩니다.
    포장
    컨텐트
    qemu
    CPU 에뮬레이터
    nasm
    어셈블리 언어
    rake
    구축 도구
    bootstrap.sh
    #!/usr/bin/env bash
    
    sudo apt-get update
    sudo apt-get install -y qemu nasm rake
    sudo update-alternatives --install /usr/bin/qemu qemu /usr/bin/qemu-system-i386 10
    
    Vagrant
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    VAGRANTFILE_API_VERSION = "2"
    
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.box = "precise32"
      config.vm.provision :shell, path: "bootstrap.sh"
    end
    

    프로그램 만들기


    다음은 "Hello, World!"에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
    hello.asm
    ; hello.asm
    [BITS 16]           ; リアルモード
    [ORG 0x7C00]        ; 開始位置
    
    start:
    mov   si, msg       ; msg の先頭位置を SI レジスタに設定する。
    call  print_string
    
    fin:
    hlt
    jmp   fin
    
    print_char:
    mov   ah, 0x0E      ; BIOSに一文字表示を伝える
    mov   bh, 0x00
    mov   bl, 0x07      ; 文字色(白)
    
    int   0x10          ; BIOSの機能を呼び出す。Call video interrupt.
    ret
    
    print_string:
    next:
    mov   al, [si]      ; 文字列から一文字を取得し AL レジスタに設定する
    inc   si            ; SI レジスタをインクリメントする
    or    al, al
    jz    exit
    call  print_char
    jmp   next
    exit:
    ret
    
    msg   db 'Hello World!', 0
    
    times 510 - ($ - $$) db 0 ; ブートシグニチャまで0埋めする
    dw 0xaa55                 ; ブートシグニチャ
    

    어셈블리 프로그램


    어셈블러는 바이너리 파일을 만들 수 있습니다.
    nasm -f bin -o hello.bin hello.asm
    
  • nasm-f<형식>[-o<출력 파일 이름>><파일 이름>
  • 디스크 이미지에 프로그램 쓰기


    플로피 이미지를 만들고 바이너리 파일에 기록합니다.
    # フロッピーディスクイメージの作成
    qemu-img create -f raw floppy.img 1440K
    # バイナリファイルの書き込み
    dd conv=notrunc if=hello.bin of=floppy.img
    
  • qemu-igcreate[-f<형식>]<파일 이름>[크기]
  • dd[conv=notrunc][if=<파일 이름 입력>][of=<파일 이름 출력>]conv=notrunc 출력 파일을 차단하지 않고 기록합니다.
  • QEMU 실행 및 종료


    플로피 이미지를 QEMU에 마운트하고 프로그램을 실행합니다.
    # QEMUの起動
    qemu -boot a -fda floppy.img -curses -monitor stdio
    # QEMUの終了
    (qemu) quit[enter]
    
  • qemu[options][디스크 이미지]
    플로피 디스크(A 드라이브)에서 시작합니다.-boot [a] 플로피 디스크(A 드라이브)에 마운트할 디스크 이미지를 지정합니다.-fda <ファイル名>cursess 인터페이스를 사용하여 VGA를 터미널로 출력합니다.-cursess 모니터 방향을 호스트 장치로 변경합니다.CUI의 경우 stdio를 지정합니다.
  • QEMU 실행 시 고려 사항


    QEMU 옵션을 -monitor stdio 로 설정하지 않으면 터미널에서 입력이 허용되지 않으므로 QEMU를 종료할 수 없습니다.다른 터미널을 열고 pkill 명령을 사용하여 프로세스를 끝내십시오.
    pkill qemu
    
    VirtualBox

    예제 프로그램 실행

    # Vagrantの起動と接続
    host$ vagrant up
    host$ vagrant ssh
    
    # サンプルプログラムの実行
    vagrant$ cd /vagrant/hello-asm
    vagrant$ rake
    
    Rakefile
    SOURCE_FILE = 'hello.asm'
    BINARY_FILE = 'hello.bin'
    IMAGE_FILE  = 'floppy.img'
    
    task :default => :run
    
    task :run => [ BINARY_FILE, IMAGE_FILE ] do
      sh "dd status=noxfer conv=notrunc if=#{BINARY_FILE} of=#{IMAGE_FILE}"
      sh "qemu -boot a -fda #{IMAGE_FILE} -curses -monitor stdio"
    end
    
    file BINARY_FILE => SOURCE_FILE do
      sh "nasm -f bin -o #{BINARY_FILE} #{SOURCE_FILE}"
    end
    
    file IMAGE_FILE do
      sh "qemu-img create -f raw #{IMAGE_FILE} 1440K"
    end
    
    require 'rake/clean'
    CLEAN.include([ '*.bin', '*.img' ])
    

    좋은 웹페이지 즐겨찾기