2017-02-05 1 views
0

지난 며칠간 작업 한 적이있는 어셈블리 코드가 있습니다. 'A'에서 'J'까지 문자를 출력해야하지만 각 문자 사이에 별표가있는 조건을 가진 광산 숙제를 위해. 출력 : A * B * C * .... J *.어셈블리의 CX 카운터 증가 (TASM)

우리가 추가해야하는 한계는 하나의 데이터 컨테이너 dl 만 사용할 수 있다는 것입니다. 또한 루핑 및 점프 조건 만 사용할 수 있습니다.

나는 대부분 내 작업을 마쳤지 만, 내 카운터 cx이 내 코드 내에서 제대로 증가하지 않는 이유를 파악하는 데 문제가 발생했습니다. 이 반복되고를 증가, 증가 작동

.model 
.code 
org 100h 
s: mov ax, 3 ; 
    int 10h  ; just clearing the screen 
    mov ah, 2 
    mov cx, 1 ; counter is just set to one for possible increment 
    mov dl, 'A' ; A is added to data container 
    int 21h  ; prints out A 
x: mov dl, '*' ; first asterisk is then added to container, replacing A 
    int 21h  ; asterisk is printed out A* 
    mov dl, 'A' ; asterisk is replace by A in the counter 
y: inc dl  ; 
    loop y  ; loops at y then increments container dl, A + 1-> B 
    int 21h  ; prints out container, A*B 
    inc cx  ; where the problem lies. Should increment but not 
    cmp dl, 'J' ; if the character in container is not above j, jumps to.. 
    jna x  ; ..where x is 
    int 20h  ; ends but doesnt due to infinite looping, container not reaching 'J' 
end s 

경우, 내가 일이 일어날 것이라고 생각하는 것은 프로세스가 다음 X에 점프마다 cx이 증가 된 점을 감안 루프 Y에 전달하는 것입니다 : 여기에 내 코드입니다 콘테이너 cx이 여러번 증가한 후에 얼마나 많은 양을 유지 하는가에 달려있다. 이것은 용기가 문자 J 위에 올라가는 조건에 이르게 할 것입니다.

이렇게 많은 문제가 있습니다. 제가 얻을 수있는 도움에 미리 감사드립니다.

+1

inc 대신 add를 사용했을 수 있습니다. add 명령어가 cx, 1 또는 w.e를 추가합니다. – Jerinaw

+0

나는 작업 설명을 얻지 못했고, 그것은 "dl"에 대한 "제한"을 의미합니까? 데이터에 대해서도'cx'를 사용하고 있습니다. 그리고 어떤 방식 으로든, 당신이 char 단위의 스트림 출력을하고 있다면,''* ''값으로'dl'을 파괴하고 다시 문자로 복원해야하므로 확실히 데이터를 위해 다른 것을 사용해야 만합니다. 그렇다면 한계는 정확히 무엇입니까? 메모리 버퍼가 없습니까? 스택 사용하지 않습니까? 'dh'는 사용할 수 없습니까? 왜'cx'는 할 수 있습니까? BTW, int 21h없이 VRAM에 직접 쓸 수 있습니까? : D 그렇다면 그것은 사소할 것입니다 : D (실제로 ptr을 쓰기 위해 더 많은 레지스터가 필요합니다 : /) – Ped7g

+0

오, 미안합니다. 내가 말했어 야했던 제한은 dl의 값을 저장할 수 없다는 것입니다. 다른 용기에. '*'를 추가하고 루프 또는 점프 조건을 통해 자체적으로 복원하여 파기해야합니다. – Emanhero

답변

3

디버거를 사용하면 알 수 있듯이이 값이 조금씩 증가합니다. 문제는 loop 명령이있어 0이 될 때까지 CX을 감소시킵니다. 따라서 늘리면 CX이 1이됩니다.

loop 전에 스택을 넣으려면 CX을 누르고 값을 유지하려면 튀어 나오십시오. 디버거를 잡아서 직접 코드를 디버깅하십시오. 그냥 CX에 의해 DL을 증가하려는 때문에

또는, 왜 그냥 ADD DL, CL 말과 루프를 사용하지?

+0

감사합니다. : D 대신 '추가'를 구현해 보겠습니다. – Emanhero