문자열 출력하기
- 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 ; /(나머지)

콘솔로 돌리기

'컴퓨터과학 > os' 카테고리의 다른 글
어셈블리 - 4. 논리연산1 (0) | 2024.04.14 |
---|---|
어셈블리 - 2. 기초 개념들 (0) | 2024.04.14 |
어셈블리 - 1. 개발환경 구축과 첫 프로젝트 (0) | 2024.04.14 |
OS30 - 7. 글자쓰기 (0) | 2024.04.08 |
OS30 - 6. c언어 사용, 화면 만들기 (0) | 2024.04.05 |