assembly - 即使我确实为变量设置了初始值,数据段也没有被初始化
问题描述
我已经编写了一个代码,该代码应该生成某种数字列表,但是即使我确实为它们分配了初始值,我的数据段变量也没有被初始化?
这是我的代码,但数据段只保留垃圾值:
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。这就是我们在随附的屏幕截图中看到的内容。
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
寄存器中重新加载它。
推荐阅读
- python-3.x - Python - AttributeError:“NoneType”对象没有“执行”属性
- ios - SKTransition 完成后 SpriteKit SKShader 翻转
- maven - 代码覆盖率 - Jacaco 和 Sonar 7.0 之间的不一致
- ansible - 从 jinja2 引用主机文件中的变量
- mysql - 从表外的值中对表进行排序但具有关系
- node.js - 使用 webpack 和 express 的 gzip 压缩,仍然提供 bundle.js 而不是 bundle.js.gz
- azure - GEN 0 垃圾爬上 Azure 这正常吗?
- android - 远程服务调用 PeripheralManager.getInstance
- excel - 通过多个字段的复杂组合过滤excel数据透视表
- tensorflow - TensorFlow Wide and Deep Model,我可以使用多少功能?