소스가 제대로 작동하는지 테스트 해주실분 계신가요?

Submitted by westporch on 2010.04.07.(Wed) - 21:31

노트북의 콘솔에서 ./reboot 명령은 제대로 실행되지만 엑스윈도에서 ./reboot 명령을 실행하면 잠시 후 액정화면이 A4용지 백지처럼 변합니다.
노트북 액정에 아무런 내용도 출력되지 않고 흰 화면만 나타난 줄 알았는데 액정을 비스듬히 빛에 비춰보면 reboot 명령이 실행되서 grub 화면이 나타납니다.
이러한 상태에서 리눅스로 부팅해서 콘솔에 reboot 명령(아래 소스의 reboot가 아닙니다.)을 입력하면 다시 컴퓨터를 시작해도 화면이 허~옇게 나옵니다.
전원 버튼을 눌러서 컴퓨터를 강제로 재시작해야 그제서야 화면 색이 제대로 출력됩니다.
뭔가 이상한거 같아서 제 데스크탑의 콘솔, 엑스윈도에서 ./reboot 명령으로 테스트 해봤는데 정상적으로 작동합니다.
제 노트북이 똥컴이라서 그런건지.. 왜 그런지 이유를 모르겠네요. 시스템을 재시작하는 어셈블리 소스입니다.

globl _start 
_start: 
             movl $88, %eax 
             movl $0xfee1dead, %ebx 
             movl $672274793, %ecx 
             movl $0x1234567, %edx 
             movl $0, %esi int $0x80

위 소스를 reboot.s 파일로 저장합니다. 그리고, 아래 두 명령을 프롬프트에 입력합니다.

as -gstabs -o reboot.o reboot.s
ld -o reboot reboot.o

./reboot 명령을 콘솔과 엑스 윈도에서 실행합니다.
(./reboot 를 일반 사용자 계정으로 실행하면 segmentation fault 에러가 발생합니다. root로 실행해야 segmentation fault가 발생하지 않습니다.)
그리고, 콘솔과 엑스윈도에서 제대로 작동하는지 아래 답글로 남겨주시면 감사하겠습니다.

./reboot

 

hounjini

작성: 2010.04.21.(Wed) - 15:26

수정: 2017.05.01.(Mon) - 14:58

굉장히 늦었지만 답글 답니다.
lenny + asus EEEPC에서 테스트 해보았습니다. x에서, 콘솔에서 해보았는데 둘 다 정상적으로 작동하였습니다.
//소스 코드에서 .global에 a가 빠졌더군요! 고쳐주시면 어셈을 모르시는 분들도 테스트해주실 수 있을거라 생각합니다. : )

hounjini님 테스트 해주셔서 감사합니다. 결국 제 컴퓨터에 문제가 있는가봅니다.
.globl은 오타가 아닌 듯 합니다. .globl 또는 .global으로 작성해도 프로그램은 정상적으로 작동합니다.
 
다음은 값 20을 ecx 레지스터에 저장하는 프로그램입니다.
.globl _start
_start:
  nop
  movl $20, %ecx
  movl $1, %eax
  movl $0, %ebx
  int $0x80

gdb로 확인해보면 ecx 레지스터에 20이 저장되었습니다. :)
http://lh6.ggpht.com/_o8c3Ao4fxbQ/S6XCcV4HbZI/AAAAAAAAAJ0/DRxXKaLvO0M/l…

localhost:/home/westporch/S# as -gstabs -o listing1.o listing1.s
localhost:/home/westporch/S# ld -o listing1 listing1.o
localhost:/home/westporch/S# gdb -q listing1
(gdb) break *_start+1
Breakpoint 1 at 0x8048055: file listing1.s, line 4.
(gdb) run
Starting program: /home/westporch/S/listing1

Breakpoint 1, _start () at listing1.s:4
4         movl $20, %ecx
Current language:  auto; currently asm
(gdb) s
_start () at listing1.s:5
5        movl $1, %eax
(gdb) print $ecx
$1 =20
(gdb)

 

hounjini

작성: 2010.04.24.(Sat) - 00:56

수정: 2017.05.01.(Mon) - 15:08

In reply to by westporch

혹시 몰라서 데스크탑에서도 테스트 해보았는데 잘 됩니다. ubuntu 9.10 + amd cpu 에서 시험해보았습니다.
-----------------------------------------------------------------
아;; 저는 .global만 알고있었는데 둘다 사용되네요.
찾아보니 둘 다 호환성을 위해 허용한다네요. :) 좋은 것 알았습니다.
원인이 조만간 밝혀지길 바랄께요~