문자열 출력하기

- PRINT_STRING : SASM에서 제공하는 문자열 출력 매크로 함수

- ssection .data에 바이트 연속으로 선언

PRINT_STRING param(출력할곳 주소)

* 문자열 종료시 0x00으로 표기

* NASM에선 ''나 ""둘다 문자열로 허용

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    PRINT_STRING msg1
    NEWLINE
    PRINT_STRING msg2
    NEWLINE
    PRINT_STRING msg3
    
    xor rax, rax
    ret
    
section .data
    msg1 db 'haha ',0x00
    msg2 db 'hellow !',0x00
    msg3 db "mnsg3 ok",0x00

 

 

입력받기

- SASM에서는 아래 두함수로 받을수 있음

- GET_DEC para1, para2 입력된 문자열 10진수로 인식

 para1 입력할 바이트 수 para2 입력받을 곳 레지스터나 메모리주소

- GET_HEX para1, para2 입력된 문자열 16진수로 인식

 para1 입력할 바이트 수 para2 입력받을 곳 레지스터나 메모리주소

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    GET_DEC 1,al    ;1바이트 입력
    GET_DEC 2,a     ;2바이트 입력
    
    PRINT_DEC 1,al
    NEWLINE
    PRINT_DEC 2,a
    xor rax, rax
    ret
    
section .bss
    a resw 1    ;2바이트 초기화되지않은 변수 a1개 선언

 

 

 

 

 

덧셈연산

- ADD para1, para2(para1 = para 1 + para2)

 para 1 : 레지스터나 메모리에있는값

 para2 : 레지스터, 메모리, 값

 *para1,2둘다 메모리인 경우는 안됨

 

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    mov ax,1    ;2바이트 레지스터에 1대입
    mov bx,3    ;2바이트레지스터 bx에 3대입
    
    add ax, bx
    PRINT_DEC 2,ax
    NEWLINE
    
    mov [a], word 7 ;2바이트 변수 a에 7대입
    add ax, [a]
    PRINT_DEC 2,ax
    NEWLINE
    
    mov bx, 2
    add [a], bx
    PRINT_DEC 2,a
    NEWLINE
    
    mov [b], byte 2
    ;add [a], [b] <= error!

    xor rax, rax
    ret
    
section .bss
    a resw 1
    b resw 1

 

 

 

뺄셈연산

- SUB para1, para2(para1 = para1 - para2)

 para1 : 레지스터 나 메모리 값

 para2 : 레지스터, 메모리, 값

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    mov ax,1
    mov bx,3
    
    sub ax, bx
    PRINT_DEC 2, ax
    NEWLINE
    
    mov [a], word 7
    sub ax, [a]
    PRINT_DEC 2,ax
    NEWLINE
    
    mov bx,2
    sub [a],bx
    PRINT_DEC 2,a
    NEWLINE
    
    mov [b], byte 2
    PRINT_DEC 2,b
    ;sub [a], [b] <= 에러
    
    xor rax, rax
    ret
    
section .bss
    a resw 1
    b resw 1

 

 

 

1바이트 곱샘연산

- MUL para(1바이트)

* para가 1바이트일때 AX = AL * para

* para는 레지스터만 허용

*곱되는값은 무조건 AL레지스터에

*결과는 AX레지스터에 반환

 

아래 코드에서 ax레지스터를 0으로 초기화안하면 ah 레지스터값에 따라 영향받기 때문

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    PRINT_DEC 2,ax
    NEWLINE
    
    ;2*3
    mov ax,0
    mov al, 2
    mov bl, 3
    mul bx
    
    PRINT_DEC 1,ax
    NEWLINE

    xor rax, rax
    ret

 

 

 

1바이트 나누기 연산

- DIV para(1바이트)

* para가 1바이트일때 : AX / para : AL(몫), AH(나머지)

* 나눠지는값은 AX에

* 연산결과는 AL, AH로 리턴됨

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    ; 7(AX) / 2 = 3(AL, 몫), 1(AH, 나머지)
    
    mov ax, 7
    mov bl, 2
    div bl
    
    mov bl, ah
    
    PRINT_DEC 1,al
    NEWLINE
    PRINT_DEC 1,bl
    NEWLINE

    xor rax, rax
    ret

 

 

 

실행파일만들고 콘솔에서 실행해보기

코드작성 -> file에서 .exe 로 저장하기 -> 콘솔로 실행

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    PRINT_STRING msg1
    NEWLINE
    
    mov ax,3
    
    PRINT_DEC 2,ax
    NEWLINE

    xor rax, rax
    ret

section .data
    msg1 db "hello",0x00

 

 

 

 

 

사칙연산 계산기 만들기

- 2개의 변수를 1바이트 단위로 받아 메모리에 저장

- 사칙연산 한 값을 1바이트 단위 메모리에 각각 저장

- 나누기 결과는 몫과 나머지를 나누어 저장

- 곱의 경우 결과를 2바이트 변수로 선언하고 사용

- 이후 결과 모두 출력

%include "io64.inc"

section .text
global main
main:
    ;write your code here
    ;input
    PRINT_STRING msg1
    GET_DEC 1,mya
    PRINT_DEC 1,mya
    NEWLINE
    
    PRINT_STRING msg1
    GET_DEC 1,myb
    PRINT_DEC 1,myb
    NEWLINE
    
    
    ;calc
    ;+
    mov al, [mya]
    mov bl, [myb]
    add al, bl
    mov [a], al
    
    ;-
    mov al, [mya]
    mov bl, [myb]
    sub al, bl
    mov [b], al
    
    ;*
    mov al, [mya]
    mov bl, [myb]
    mul bl
    mov [c], ax
    
    ;/
    mov ax,0
    mov al,[mya]
    mov bl,[myb]
    div bl;
    mov [d],al
    mov [e],ah
    
    
    
    
    ;output
    PRINT_STRING msg2
    PRINT_DEC 1,a
    NEWLINE
    
    PRINT_STRING msg3
    PRINT_DEC 1,b
    NEWLINE
    
    PRINT_STRING msg4
    PRINT_DEC 2,c
    NEWLINE
    
    PRINT_STRING msg5
    PRINT_DEC 1,d
    NEWLINE
    
    PRINT_STRING msg6
    PRINT_DEC 1,e
    NEWLINE
    

    xor rax, rax
    ret

section .data
    msg1 db 'input data:',0x00
    msg2 db '+:',0x00
    msg3 db '-:',0x00
    msg4 db '*:',0x00
    msg5 db '/(q):',0x00
    msg6 db '/(r):',0x00

section .bss
    mya resb 1; input 1
    myb resb 1; input 2
    a resb 1 ; +
    b resb 1 ; -
    c resw 1 ; *
    d resb 1 ; /(몫)
    e resb 1 ; /(나머지)

 

콘솔로 돌리기

 

 

+ Recent posts