push ds
xor ax,ax
push ax
위의 명령은 프로그램의 수행이 끝나고 다시 원래의 상태로 돌아올 수 있도록 DS레지스터의 값을 스택에 저장해 놓는 명령이라는데
push ds가 ds 레지스터의 값을 스택에 저장해놓은 거라는 건 알겠는데
xor ax,ax
push ax
이건 뭐임??
----수정(23:09 2015)
.model small
.stack 100h
.data
데이터 입력
.code
start proc
push ds
xor ax,ax
push ax
mov ax,@data
mov ds,ax
작성할 프로그램
ret
start endp
end
기타등등이겠지
xor ax ax는 ax를 0으로만듬 빼기보다 빨라서 저리 최적화함
아닌데 책에는 ds레지스터만 저장하는거라고 써있는데?
스택에 0을 왜넣는지는 모르겠당
ax레지스터도 같이 저장하는거임?
아 저거 리턴0임
흠... 뭘까
ax에 함수반환값 넣고 함수끝냄
XOR AX,AX는 CLR AX랑 같은 명령같은데, 즉 AX = 0x00000000; 가 되시겠다. 그리고 그걸 스텍에 또 저장했네. 뭘까... 의도적으로 만든 0을 대피시킬리 없잖아. 의도를 모르겠음. 다만 어셈코드에서 PUSH와 POP을 조합해서 단순 대피 외에도 여러가지 용도로 응용하는데 저 코드 뒤를 모르니...
전체 코드 수정할게 기둘
상병2호봉 // 니말에 이해가 안가는건 push ds 명령 후에 push ax (여기서 ax는 0이겠지)를 넣어서 RET만나서 0번지로 복귀한다면, 어쨋든 스텍포인터는 push ds를 수행한 이후일텐데? SP-1이라도 수행하는 흔적도 없어서 너가 말한 의도는 아닐수도 있다.
그르네 프로그램 끝낸다길래 짧게생각했음
수정했다 전체 코드올림
수정한거 보면 상병2호봉 말대로 0번지로 계속 간다는건데. 계속 반복하다가 스텍오버플로우 발생하는거 아니냐? 잘 모르겠다
작성할 프로그램이 뭐지
그 안에 작성할프로그램 코드를 위치시키라는말이지
코드만보면 상황상 ds에 무엇인가 들었는데(쓰레기가아닌 뭔가 정보) ax를 초기화시켜서 거기에 data를 넣고 ax를 dx에 대입시켰네
아니시발 dx가아니라 ds네 데이터세그먼트 ㅡㅡ
내생각에는 ds에 새로운 변수 넣을려고 ax를초기화시켜서 ax에 넣을변수를 대입한다음에 ds에 넣은듯 나도 잘모름 어셈초짜라
ds에 새로운변수를 넣어서 프로그램작성한다음에 초기의 ds를 백업한듯
백업이아니라 초기ds값을 가져온듯
세그먼트 옵셋 개념부터 잡자.
도스에서 프로그램을 실행하면 초기 DS 값은 도스에서 프로그램마다 할당해 주는, 프로세스 정보를 저장하는 구조체 영역인 PSP(Program Segment Prefix) 영역의 시작 부분을 가리킴. PSP 영역의 시작 부분은 프로그램을 종료하는 기계어인 CD 20(INT 20h) 코드가 들어있다. PUSH DS, XOR AX, AX, PUSH AX하고 마지막에 RETF하면 DS:0000으로 return이 되는 거지. 마지막에 RET가 아니라 RETF로 해야 정상 동작한다.
RET => IP 값만 caller로 되돌림. RETF(Return from far call) => CS:IP 값을 스택을 참조하여 모두 caller로 되돌림.
저렇게 짜는 코드는 병신같은 코드가 맞고 일반적으로는 MOV AX, 4c00h / INT 21h을 불러서 정상적으로 종료시킨다.
프로그램을 MOV AH, 4CH, INT 21H 로 종료할거면 저딴거 필요없음.
저렇게 짜는 애들은 FAR Procedure 로 만든 Main 에서 return 하고싶어 하는 애들인데, Main 프로시져를 다른 소스코드에 붙이기 쉽게 하려고 하는거다.
답변 땡큐