2017-05-21 1 views
0

나는 다음과 같은 코드가 있습니다DS의 내용을 잃지 않도록 문자열을 메모리에 저장할 수 있습니까?

[bits 16] 
org 0x100 

segment .text 
    global start 

start: 
    lea si,[msg0] 
    call print 

    call gets 

    lea si,[msg1] 
    call print 

    lea si,[ds:0] 
    call print 

    ; Termina el programa 
    mov ah,00h 
    int 21 

gets: 
    xor bx,bx 
    mov ds,bx 

gets_start: 
    ; Leemos un caracter 
    mov ah,00h 
    int 16h 

    ; Comprobamos si se presiono enter 
    cmp ah,$1C 
    je gets_end 

    ; provocamos eco 
    mov dl,al 
    mov ah,02h 
    int 21h 

    ; Almacenamos el caracter 
    mov [ds:bx],al 
    inc bx 
    jmp gets_start 

gets_end: 
    ; agregamos 0 al final de la cadena 
    xor al,al 
    inc bx 
    mov [ds:bx],al 

    ; Nueva linea 
    mov dl,0xA 
    mov ah,02h 
    int 21h 

    ret 

print: 
    ; Movemos el caracter a dl 
    mov dl,[si] 

    ; Comprobamos si el caracter es 0 
    cmp dl,0 
    je print_end 

    ; Imprimimos el caracter 
    mov ah,02h 
    int 21h 

    ; Avanzamos al siguiente caracter 
    inc si 
    jmp print 

print_end: 
    ; Termina de imprimir 
    ret 

segment .data 
    msg0 db "Ingrese su nombre: ",0 
    msg1 db "Hola ",0 

을하지만 gets에 (그러므로 나는 msg1를 인쇄 할 수 없습니다) 나는 DS가 문자열을 등록 해 저장 사용하고 난이 DS에 대한 참조가 등록 잃게됩니다. 어디에서 문자열을 저장할 수 있습니까?

저는 어셈블러를 처음 사용하며 메모리 관리에 대해 배우고 있습니다.

답변

1

1) 당신은 스택에 거의 모든 16 비트 레지스터를 저장할 수 있습니다 레지스터들이 저장된 역순으로 읽을 수 있어야

push ds 
... 
pop ds 
ret 

참고.

push ds 
push ax 
... 
pop ds 
pop ax 

참고 그 ret (적어도 메모리 모델 근처에서 사용하는 경우) 실제로 이러한 맥락에서 : ax의 이전 값이 마지막으로 저장되어 있기 때문에 처음 읽을 수 있도록 다음의 예는 axds의 값을 교환 할 것 의미는 pop ip을 의미합니다. 따라서 ret 명령어를 수행하기 전에 레지스터에 저장된 스택에 저장된 모든 값을 다시 읽어야합니다.

2) DS:BX=0:0에 문자열을 쓰고 있습니다.

리얼 모드에서이 주소는 인터럽트 테이블을 포함합니다. 데이터를 쓰는 것은 좋은 생각이 아닙니다. 문자열이 길면 컴퓨터가 확실히 충돌합니다!

이 더 의미가 같이 그것을 할 수 있도록합니다 :

... 

gets: 
    lea bx, [strgbuf] 
gets_start: 

    ... 

segment .data 
    msg0 db "Ingrese su nombre: ",0 
    msg1 db "Hola ",0 
    ; Space for the string 
    strgbuf db "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
+0

이 잘 보이지만, 동적 메모리는 C와 같은 존재? –

+0

@CristoferFuentes 운영 체제에 따라 다릅니다. – fuz

+1

동적 메모리의 경우 세 가지 가능성이 있습니다. 1) 스택을 사용합니다. 그러나 이것은 "ret"를 사용하는 함수에서 돌아올 때 메모리가 "해제"되었음을 의미합니다. 2) 운영 체제 사용 3) 큰 메모리 영역을 사용하고 다이나믹 메모리를 직접 처리하십시오. –

관련 문제