지난 며칠간 작업 한 적이있는 어셈블리 코드가 있습니다. '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 위에 올라가는 조건에 이르게 할 것입니다.
이렇게 많은 문제가 있습니다. 제가 얻을 수있는 도움에 미리 감사드립니다.
inc 대신 add를 사용했을 수 있습니다. add 명령어가 cx, 1 또는 w.e를 추가합니다. – Jerinaw
나는 작업 설명을 얻지 못했고, 그것은 "dl"에 대한 "제한"을 의미합니까? 데이터에 대해서도'cx'를 사용하고 있습니다. 그리고 어떤 방식 으로든, 당신이 char 단위의 스트림 출력을하고 있다면,''* ''값으로'dl'을 파괴하고 다시 문자로 복원해야하므로 확실히 데이터를 위해 다른 것을 사용해야 만합니다. 그렇다면 한계는 정확히 무엇입니까? 메모리 버퍼가 없습니까? 스택 사용하지 않습니까? 'dh'는 사용할 수 없습니까? 왜'cx'는 할 수 있습니까? BTW, int 21h없이 VRAM에 직접 쓸 수 있습니까? : D 그렇다면 그것은 사소할 것입니다 : D (실제로 ptr을 쓰기 위해 더 많은 레지스터가 필요합니다 : /) – Ped7g
오, 미안합니다. 내가 말했어 야했던 제한은 dl의 값을 저장할 수 없다는 것입니다. 다른 용기에. '*'를 추가하고 루프 또는 점프 조건을 통해 자체적으로 복원하여 파기해야합니다. – Emanhero