나는 다음과 같은 코드가 있습니다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에 대한 참조가 등록 잃게됩니다. 어디에서 문자열을 저장할 수 있습니까?
저는 어셈블러를 처음 사용하며 메모리 관리에 대해 배우고 있습니다.
이 잘 보이지만, 동적 메모리는 C와 같은 존재? –
@CristoferFuentes 운영 체제에 따라 다릅니다. – fuz
동적 메모리의 경우 세 가지 가능성이 있습니다. 1) 스택을 사용합니다. 그러나 이것은 "ret"를 사용하는 함수에서 돌아올 때 메모리가 "해제"되었음을 의미합니다. 2) 운영 체제 사용 3) 큰 메모리 영역을 사용하고 다이나믹 메모리를 직접 처리하십시오. –