[완료] 어셈블리어 코드 질문 쫌 부탁드립니다...
글쓴이: hoongwan / 작성시간: 목, 2010/12/30 - 7:12오후
[org 0]
jmp 0x07C0:start
start:
mov ax, cs
mov ds, ax
mov ax, 0xB800
mov es, ax
mov di, 0
lea esi, [msgBootloader]
call printf
jmp $
printf:
push eax
printf_loop:
or al, al ;이 줄 포함해서 2줄을 지우고 3줄 밑에 주석처리 된 똑같은 소스의 주석을 풀고 컴파일하면
jz printf_end ; 실행이 됩니다.
mov al, [esi]
mov byte [es:di], al
inc di
; or al, al
; jz printf_end
mov byte [es:di], 0x07
inc di
inc esi
jmp printf_loop
printf_end:
pop eax
ret
msgBootloader db "Successful Accessing Bootloader", 0
times 510-($-$$) db 0
dw 0xAA55
왜 or al, al \ jz printf_end 가 위에있으면 아무것도 안뜨죠?
push 가 혹시 eax를 저장후에 해당 레지스터 초기화까지 하나요?
Forums:
맨 처음에 mov ax, 0xB800를 이용해서
맨 처음에 mov ax, 0xB800를 이용해서 al에 0을 넣으셨습니다.
그리고나서 바로 or al, al을 실행하시니 이미 al은 0이기 때문에 zero flag가 1이 되어서 printf_end으로 점프한 것으로 보입니다.
하지만 or al, al을 밑에 넣는 경우에는 mov al, [esi]이 실행되기 때문에 al에 출력할 문자열의 아스키코드 값이 들어가므로
정상 실행됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
아...
참... 신경 쓸게 많네요.. 저런걸로 몇시간씩 해메고 있었다니...
감사합니다.
...
댓글 달기