2016-10-17 2 views
0

Assembly Language를 처음 사용하기 때문에 이미 변수에 경로를 선언하면 폴더를 만들 수 있지만이 경우 입력 한 문자열로 폴더를 만들어야하지만 어떻게해야할지 모르겠다. 해. 나는 문자열을 입력 한 후에 항상 "프로그램 종료"를 얻는다. 여기 내 코드입니다 : 나는 저렴한 요금은 내가 덕분에 훨씬 더 해요, 지금까지 일부 무료 디버거를 다운로드하려고 결코 시간 ... 당 단지 $ 500부터, 나는 당신의 디버거 될 것어셈블리에 입력 문자열이있는 폴더를 만드는 방법은 무엇입니까?

org 100h 

jmp start 

msg1: db "[C] Create folder", 0ah, 0dh 
msg2 db "[X] Exit", 0ah, 0dh 
msg3 db "Press the key of your choice: $", 0ah, 0dh 
msg4: db "Type the folder name: " 
dir1: db "$", 0 

start: 
    mov ax, cs 
    mov dx, ax 
    mov es, ax 

    jmp menu 

menu: 
    mov ax, 03h 
    int 10h 

    mov dx, msg1 
    mov ah, 09h 
    int 21h 

    mov ah, 01h 
    int 21h 

    cmp al, 43h 
    je cFold 

    cmp al, 78h 
    je exit 


cFold: 
    mov ax, 03h 
    int 10h 

    mov dx, msg4 
    mov ah, 09h 
    int 21h 

    mov dx, dir1 
    mov ah, 0ah 
    int 21h 

    mov ah, 39h 
    int 21h 

exit: 
    mov ah, 4ch 
    int 21h  


ret 
+0

적어도 int 21h/0Ah 호출을 잘못 사용하고 있습니다. 설명서를 읽으십시오. 간단히 말해 입력을 읽거나 길이를 알 수있는 저장 공간을 지정하지 않습니다. 예를 들어 http://spike.scu.edu.au/~barry/interrupts.html#ah0a –

+0

을 참조하십시오 다음 번에 어셈블러 사용 및 대상 플랫폼을 지정하십시오. 도스는 'int 21h'로 추측하기 쉽지만, 어셈블러는 masm/tasm/nasm (아마도 nasm 가능성이 높습니다)과 유사하고 경우에 따라 미묘한 차이가 중요하기 때문에 알기가 어렵습니다. – Ped7g

답변

0

, 영수증을 비공개 메시지로 보내 드리겠습니다.


jmp menu 
menu: 

여기 dada 인? : 쉽게 독자 이해 할 수 있도록 (당신이 '' 아스키 문자 구문없이 정말 바보 어셈블러가없는 한) D


cmp al, 43h 
    je cFold 

    cmp al, 78h 
    je exit 

cFold: 

당신은 cmp al,'C'cmp al,'x' 이러한 쓸 수 있습니다. 또한 흐름 제어에 대한 제어가 충분히 제어되지 않습니다. 따라서 "x"이외의 다른 입력은 cFold 레이블로 이동하여 폴더를 만듭니다.

어쩌면 마지막 테스트 후 jmp menu과 같은 것을 추가하고 싶습니까? 방법 ah=0ah DOS 서비스 작품이 아니다


; dir1: db "$", 0 
    mov dx, dir1 
    mov ah, 0ah 
    int 21h 

. 서류를 어디에서 받았습니까? 그것을 버리고 올바른 것을 찾아보십시오 (빠른 검색은 나를 one로 인도했습니다).

실제로 문자열이 메모리에 저장되는 방식을 이해하지 못하는 것 같습니다.

나 메모리에 무엇을했는지를 보여주지 : 기계 코드 바이트로

dir1: db "$", 0 
start: 
    mov ax, cs 

컴파일 : 24 00 8c c8 ('$', 제로 mov ax,cs 명령). 코드의 나머지 부분은 물론 ... (아마도 "$"24 00으로 컴파일됩니다. 어셈블러에서 "" 문자열 리터럴이 널로 끝나면 0을 하나 더 추가 한 다음 디버거/디스어셈블러를 체크인하거나 어셈블러에서 " 목록 "파일)

지금 0A DOS 서비스에 대한 문서를 읽고, 그것은 ds:dx에 입력 버퍼 포인터를 기대하고, 버퍼의 구조는 다음과 같습니다

최대 크기
  1. 1 바이트 (즉, '$'가 당신에 있어요 입력, 36 문자 길이 허용)
  2. "" m 마지막 입력 ... "(영 귀하의 경우 괜찮습니다) 버퍼 자체

  • 최대 크기 바이트 당신은 모든 버퍼를 제공하지 않는 mov ax,cs 명령 대신있다.

    그래서 사용자가 "c : \ very \ long \ path \ with \ many \ subdirectories \"라고 입력하면 나머지 코드가 너무 겹쳐서 덮어 쓰여 DOS에서 돌아 오면 충돌이 발생합니다.


    mov ah, 39h 
        int 21h 
    

    그리고 그 방법 ah=39h DOS 서비스가 작동하지 않습니다. ds:dx ASCIZ (ASCII zero terminated) 문자열을 제공해야합니다.

    입력 루틴을 수정하려면 최대 값이 아닌 입력의 첫 번째 문자를 가리 키기 위해 이전 값 dir1mov dx,dir1+2으로 조정해야합니다.

    입력을 제로로 종료해야하므로 디버거에서 DOS에서 반환되는 내용 (CR/LF에 입력 한 문자가있는 경우)을 체크인하고이를 검색하여 0으로 덮어 써야합니다. 디렉토리 생성에 대한 적절한 입력 (입력 길이는 [dir1 + 1] 바이트로 반환되므로 "찾기"는 그리 어렵지 않고 길이는 마지막 CR로 계산되므로 (dir1+2)[length-1] = 0;을 덮어 쓰면됩니다).


    전반적으로 당신이 지금입니다 을 일부 디버거을 발견하고 그것을 사용하는 방법을 배워야 할 가장 중요한 것은 - 당신이 디버거 위에 설명 된 모든 버그를 발견하고 난 확인할 수 있습니다까지 권리.

    이 시점에서 프로그래밍을 다시 시도하고 DOS int 21h docs를 다시 읽고 정확하게 사용하고 있다면 각 호출을 확인하십시오. 그리고 모든 문제를 해결하고 디버거에서 수정 사항을 확인하십시오.

    디버거가없는 어셈블러에서 프로그래밍은 눈가리개가있는 로봇을 어셈블하는 것과 같습니다.