Assembly 即使我为变量设置了初始值,数据段也没有初始化

Assembly 即使我为变量设置了初始值,数据段也没有初始化,assembly,initialization,dos,x86-16,memory-segmentation,Assembly,Initialization,Dos,X86 16,Memory Segmentation,我写了一个代码,它应该是一个数字列表,但是我的数据段变量没有被初始化,即使我给它们分配了一个初始值 这就是我运行DS:0000时的样子: 这是我的代码,但数据段只保留垃圾值: MODEL small STACK 100h DATA SEGMENT size1 dw 0000h arr dw 20 dup(0000h) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA sidra_rekursivit proc mov b

我写了一个代码,它应该是一个数字列表,但是我的数据段变量没有被初始化,即使我给它们分配了一个初始值

这就是我运行DS:0000时的样子:

这是我的代码,但数据段只保留垃圾值:

MODEL small
STACK 100h

DATA SEGMENT
    size1 dw 0000h
    arr dw 20 dup(0000h)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

sidra_rekursivit proc
    mov bp, sp
    xor ax, ax
    mov ax, [bp+2]
    ; tnai azira
    cmp ax, 1
    je azira
    
    ; tempo
    mov cx, ax ; save ax
    shr ax, 1
    jnc zugi ; if zugi

    
izugi:  ; else
    mov ax, cx
    ;multiply by 3
    shl ax, 1
    add ax, cx
    ;end multiply
    ; add 1
    inc ax
    
    push ax
    call sidra_rekursivit
    jmp azira
    
zugi:
    push ax
    call sidra_rekursivit
    
azira:
    ; put the numbers in arr
    mov bx, [size1] ; arr size
    xor dx, dx ; clear dx
    mov dx, [bp+2] ; take the number from the stack
    mov word ptr arr[bx], dx ; put the number in the arr
    inc size1 ; increase the array posiotion
    ret 2
sidra_rekursivit endp

start:
;input
    mov ah, 1
    int 21h
    
    mov ah, 0
    sub al, 48
    mov dh, 10d
    mul dh
    mov dl, al
    
    mov ah, 1
    int 21h
    
    mov ah, 0
    sub al, 48
    add dl, al
    
; function call: stack push
    ; push input
    xor dh, dh
    push dx
    call sidra_rekursivit
    
exit:
    mov ax, 4c00h
    int 21h
CODE ENDS
END start

你知道怎么解决吗?

当.EXE程序在DOS环境下启动时,
DS
段寄存器指向ProgramSegmentPrefix PSP。这就是我们在附带的屏幕截图中看到的

假设DS:DATA
实际上是汇编程序的一个指示,因此它可以验证数据项的可寻址性。要使
DS
指向您的
数据段
,您需要像
mov-ax、@DATA
mov-DS、ax
这样的代码。把它放在代码开始执行的地方

start:
  mov ax, @DATA
  mov ds, ax
  ;input
  mov ah, 1
  int 21h

不相关,但递归过程调用将失败,因为调用之间没有保留
BP
寄存器,或者没有从
SP
寄存器重新加载它。

当.EXE程序在DOS环境中启动时,
DS
段寄存器指向ProgramSegmentPrefix PSP。这就是我们在附带的屏幕截图中看到的

假设DS:DATA
实际上是汇编程序的一个指示,因此它可以验证数据项的可寻址性。要使
DS
指向您的
数据段
,您需要像
mov-ax、@DATA
mov-DS、ax
这样的代码。把它放在代码开始执行的地方

start:
  mov ax, @DATA
  mov ds, ax
  ;input
  mov ah, 1
  int 21h

不相关,但您的递归过程调用将失败,因为您没有在调用之间保留
BP
寄存器,或者您没有从
SP
寄存器重新加载它。

您如何构建和链接此程序?您可能需要手动设置
DS
,使用MOV AX、@DATA;MOV-DS,AX`。我不确定细节,因为我不知道你在为什么汇编程序和工具链编程。你是如何构建和链接这个程序的?你可能需要用MOV AX、@DATA;MOV-DS,AX`。我不确定细节,因为我不知道你在为什么汇编程序和工具链编程。非常感谢你的帮助,它成功了!(如果您还需要将ES设置为相同的段基,例如,对于
rep movsb
,请使用
mov ES,ax
)非常感谢您的帮助,它成功了!(如果需要将ES也设置为相同的段基,例如对于
rep movsb
,请使用
mov ES,ax