ASSEMBLY
jmp 명령어
(c에서는 goto 와 비슷한 역활)
예제
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD
INCLUDE io.h
cr EQU 0dh
Lf EQU 0ah
.STACK 4096
.DATA
sum DWORD ?
explain BYTE cr, Lf, "As you input numbers one at a time, this", cr, Lf
BYTE "program will report the count of numbers so far.", cr, Lf
BYTE "the sum do far, and the average.", cr, Lf, Lf, 0
prompt BYTE "Number?", 0
number BYTE 16 DUP (?)
countLabel BYTE "count", 0
sumLabel BYTE " sum", 0
avgLabel BYTE " average", 0
value BYTE 11 DUP (?), 0
nextPrompt BYTE cr, Lf, Lf, "next ", 0
.CODE
_start:
output explain
mov sum, 0
mov ebx, 0
forever:
output prompt
input number, 16
atod number
add sum, eax
inc ebx
dtoa value, ebx
output countLabel
output value
dtoa value, sum
output sumLabel
output value
mov eax, sum
cdq
idiv ebx
dtoa value, eax
output avgLabel
output value
output nextPrompt
jmp forever
INVOKE ExitProcess, 0
PUBLIC _start
END
실행화면
평균값을 구하는 프로그램이며 무한반복을 한다.
LINUX - group
소스
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int iArg, char * cpaArg[])
{
FILE * stpFd;
int iCnt;
int iNum;
char * cpGName = 0;
char * cpSName;
char * cpGID = 0;
char * cpGList = 0;
char * cpRet = 0;
char caBuff[1024];
if(1 < iArg)
{
cpSName = cpaArg[1];
}
else
{
cpSName = 0;
}
stpFd = fopen("/etc/group", "r");
if(0 == stpFd)
{
printf("fopen() failed\n");
return 100;
}
iNum = 1;
if(1 < iArg)
{
while(1)
{
cpRet = fgets(caBuff, sizeof(caBuff), stpFd);
if(0 == cpRet)
{
printf("%s is not found\n", cpSName);
cpGName = 0;
fclose(stpFd);
return 50;
}
if(0 == strncmp(cpSName, caBuff, strlen(cpSName)))
{
break;
}
++iNum;
}
cpGName = caBuff;
for(cpRet = caBuff; *cpRet != '\n'; ++cpRet)
{
if(':' == *cpRet)
{
*cpRet = 0;
}
}
*cpRet = 0;
cpGID = cpGName + strlen(cpGName) + 3;
cpGList = cpGID + strlen(cpGID) + 1;
if(0 == *cpGID)
{
printf("%d. NoName\n", iNum);
}
else
{
printf("%d. %s\n", iNum, cpGID);
}
printf("GName : %s\n", cpGName);
printf("GID : %s\n", cpGID);
printf("GList : %s\n", cpGList);
putchar('\n');
}
else
{
cpGName = caBuff;
while(1)
{
for(iCnt = 0; 4 > iCnt; ++iCnt)
{
cpRet = fgets(caBuff, sizeof(caBuff), stpFd);
if(0 == cpRet)
{
printf("End of file\n");
break;
}
for(cpRet = caBuff; *cpRet != '\n'; ++cpRet)
{
if(':' == *cpRet)
{
*cpRet = 0;
}
}
*cpRet = 0;
cpGID = cpGName + strlen(cpGName) + 3;
cpGList = cpGID + strlen(cpGID) + 1;
if(0 == *cpGID)
{
printf("%d. NoName\n", iNum);
}
else
{
printf("%d. %s\n", iNum, cpGID);
}
printf("GName : %s\n", cpGName);
printf("GID : %s\n", cpGID);
printf("GList : %s\n", cpGList);
putchar('\n');
++iNum;
}
if(0 == cpRet)
{
break;
}
getchar();
}
}
fclose(stpFd);
return 0;
}
실행결과
실행파일 이름은 ggroup로 만들었으며 실행파일 이름뒤에 그룹이름을 치면 특정그룹이 검색 그냥 실행시키면 모든 그룹을 4개씩 보여주며 엔터를 치면 다음칸으로 넘어간다.
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
9월 4일 어셈블리 숙제 (0) | 2013.09.04 |
---|---|
jns와 jnz 소스분석 - 문예진 (1) | 2013.09.04 |
9월2일자 ASM 숙제 (0) | 2013.09.04 |
Group 파일 분석 [문남경] (0) | 2013.09.04 |
group 파일 분석 (0) | 2013.09.03 |
UNIX 숙제 -/etc/group -0903 -임기준 (0) | 2013.09.03 |
어셈블리 과제 - 조유진 (0) | 2013.09.02 |
어셈블리 복습 (실수는 어떻게 계산 되는가?) (1) | 2013.09.02 |