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

问题描述

我已经编写了一个代码,它应该生成某种数字列表,但是即使我为它们分配了初始值,我的数据段变量也没有被初始化?

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

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,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。这就是我们在附带的屏幕截图中看到的内容。

ASSUME DS:DATA 只是汇编程序的指示,因此它可以验证数据项的可寻址性。要真正使 DS 指向您的 DATA SEGMENT,您需要像 mov ax,@DATA mov ds,ax 这样的代码。把它放在你的代码开始执行的地方。

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

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