は、私は次のコードを持っている: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
に、私はDSの文字列を保存するには登録を使用して、私は(それゆえ私はmsg1
を印刷することはできません)DSレジスタへの参照を失います。私はどこで文字列を保存することができますか?
私はアセンブラを初めて使用しており、メモリ管理について学んでいます。
これは正常に見えるが、動的メモリは、cのように存在していますか? –
@CristoferFuentesオペレーティングシステムによって異なります。 – fuz
ダイナミックメモリの場合、次の3つの可能性があります。1)スタックを使用します。しかしこれは、 "ret"を使って関数から戻るときにメモリが "解放"されることを意味します。 2)オペレーティングシステムを使用してください3)より大きなメモリ領域を使用して、ダイナミックメモリを自分で処理してください。 –