본문 바로가기
코스웨어/13년 스마트컨트롤러

ASSEMBLY - jmp 명령어, group 파일 분석 - 전영기

by 알 수 없는 사용자 2013. 9. 4.
728x90
반응형

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개씩 보여주며 엔터를 치면 다음칸으로 넘어간다.

728x90