어셈블리 언어를 배우려고하는데 배열에 쓰는 데 간단한 문제가 있습니다. 내 프로그램은 명령 줄 인수를 읽고이를 표시하고 배열에 써야합니다. 아래의 코드에는 하나의 표시된 선이 있습니다. 이 줄 주석으로 컴파일 된 컴파일 된 프로그램을 잘 작동하지만 주석 처리하지 않으면 몇 가지 문자를 표시 한 후 중단됩니다. 여기서 뭐가 틀린거야? 짧은 인수 행이있을 때 작동하지만이 배열은 전체 명령 줄을 포함 할만큼 충분히 커야합니다. 내가 여기서 뭔가를 놓치고 있니?어셈블리 언어로 배열에 쓰는 데 문제가 있습니다.
assume cs:kod, ds:dane
kod segment
.286
start:
mov ax,seg wstos
mov ss,ax
mov sp,offset wstos
xor cx,cx
xor ax,ax
mov si,80h
mov dl,[si]
mov cl,dl
mov ah,2h
int 21h
inc si
xor di,di
petla:
inc si
mov dl,[si]
;mov [tablica + di],dl <<<< this line
test dl,dl
jz sprawdz
int 21h
inc di
dalej:
loop petla
sprawdz:
mov al,[si+1]
cmp al,0
jne dalej
koniecprogramu:
mov ax,4c00h
int 21h
dane segment
tablica db 128 dup(0)
dane ends
stos1 segment STACK
dw 256 dup(?)
wstos dw ?
stos1 ends
도움 주셔서 감사합니다. 어제 나 스스로 그것을 실제로 풀었다. ;) 문제가 ds 레지스터를 초기화하지 못했습니다. 이제 모든 것이 정상적으로 작동합니다. 항상 명령이 나를 위해 그것을한다고 가정한다고 생각했습니다. 그럼 실제로이 명령은 무엇을하고 있습니까? 어디서나 찾을 수 없습니다. – Dcortez
어셈블러가 레이블 (ds : segment)의 주소/오프셋을 계산하려고 할 때 assum 지시문의 매개 변수를 참조하여 수행합니다. 이것은 물론 ds가 가정 된 세그먼트의 값을 포함한다는 것을 전제로합니다. 포인터 (예 : di)가 byte, word, dword 또는 구조체를 가리키는 것으로 가정 할 수있는 invoke/call 매크로에도 사용됩니다. –