求帮忙,申请分配内存从第3次开始时到最后的段首址一直是一样的

Liudx-liudx 2018-10-17 11:46:37
mdisp macro msg
lea dx,msg
mov ah,09h
int 21h
endm
data segment
head dw ?
pt dw ?
buff db ?,?,0ah,0dh,"$"
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov cx,20
next:mov bx,1
mov ah,48h
int 21h
jc disp
mov es,ax
mov WORD ptr es:[0],cx
mov WORD ptr es:[2],0
cmp head,0
jnz go
mov head,es
jmp kkk
go: push ds
mov ds,pt
mov WORD ptr ds:[2],es
pop ds
kkk:mov pt,es
loop next
disp:mov bx,head
again:cmp bx,0
jz done
mov es,bx
mov ax,es:[0]
mov dl,10
idiv dl
add ax,3030h
lea bx,buff
mov [bx],2020h
cmp al,'0'
jle lower
mov [bx],al
inc bx
lower:mov [bx],ah
mdisp buff
mov bx,es:[2]
mov ah,49h
int 21h
jmp again
done:mov ah,4ch
int 21h
code ends
end start
最后应该显示20,19...1.
可只会显示20,19这两个数。用DEBUG调试后发现第1次申请内存空间AX=0172H,第二次AX=0174H,可从第三次到20次 AX就一直等于0008,这是怎么回事?另外分配空间的段首址会不会给出0000H这个段首址叱?
...全文
455 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2018-10-18
  • 打赏
  • 举报
回复
上面 #4 收回,看错了
zara 2018-10-18
  • 打赏
  • 举报
回复
另外,申请内存,应该对成功了的内存句柄都保存好,以便适当时候进行释放;你这个好像就保存/释放了一个。
zara 2018-10-18
  • 打赏
  • 举报
回复
那是申请内存出错了吧。通常的,内存会全部分配给程序的,所以,在申请内存前,一般应先释放内存。开始有些能申请到,可能是由于你申请的内存比较小,dos 的使用上也残留了些空洞。
Liudx-liudx 2018-10-18
  • 打赏
  • 举报
回复
可前两次没有问题呀。为什么到第三次时就出了问题。
  • 打赏
  • 举报
回复
确实应该是内存分配失败导致的,可以把.exe头部偏移000c位置的16位值FF FF改小,比如00 10,或者使用tiny模式生成.com文件,我忘记是否有伪指令、编译开关或者配置文件可以设置最小、最大内存分配这些值
  • 打赏
  • 举报
回复
循环中改了cx

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧