/************* main.c *******************************/
char c = 0xff;
short s = 0xffff;
int i = 0xffffffff;
extern void inc_size(), dec_size();
main() {
/* type casting: increment size */
c = 10;
inc_size();
printf("c = %d\ts = %d\ti = %d\n", c, s, i);
c = -10;
inc_size();
printf("c = %d\ts = %d\ti = %d\n", c, s, i);
/* type casting: decrement size */
i = 100;
dec_size();
printf("c = %d\ts = %d\ti = %d\n", c, s, i);
i = -100;
dec_size();
printf("c = %d\ts = %d\ti = %d\n", c, s, i);
}
/******************************************************/
위 프로그램에서 사용되는 inc_size(), dec_size() 를 어셈블리
프로그램으로 작성하라.
inc_size() 함수는 8비트 전역변수인 c 를 16비트로 확장하여
전역변수 s 에 넣고, 또한 32비트로 확장하여 전역변수 i 에 넣는다.
dec_size() 함수는 32비트 전역변수인 i 를 16비트로 줄여서
전역변수 s 에 넣고, 또한 8비트로 줄여서 전역변수 c 에 넣는다.
위 프로그램이 정상적으로 실행될 경우 화면에 다음과 같은 내용이 출력된다.
$ main
c = 10 s = 10 i = 10
c = -10 s = -10 i = -10
c = 100 s = 100 i = 100
c = -100 s = -100 i = -100
<size.asm>
%include "asm_io.inc"
segment .data
extern _c
extern _s
extern _i
segment .bss
segment .text
global _inc_size
global _dec_size
_inc_size:
mov eax, 0
mov al, [_c]
cbw ;byte(8bit) -> word(16bit)
mov [_s], ax
mov ax, [_s]
cwde ;word(16bit) -> double word(32bit)
mov [_i], eax
ret
_dec_size:
mov eax, 0
mov eax, [_i]
mov [_s], ax
mov [_c], al
'NASM' 카테고리의 다른 글
| 어셈블리어 메모리공간에 저장되는 과정 (0) | 2009/05/14 |
|---|---|
| Bit Operations (0) | 2009/05/12 |
| push,pop (0) | 2009/05/12 |
| 어셈블리어 (0) | 2009/05/11 |



Prev
