emu8086中使用org指令程序无法正常执行问题求助
问题原因
emu8086汇编器中,org指令的作用是设定当前段内的偏移地址指针。你在Count变量后写org 3500h时,汇编器会自动在Count和StuId之间填充3500h - 1 = 13567个值为0的空字节;后续org 3600h又会在StuId和Dest之间填充3600h - 350Ah = 246个空字节。最终生成的程序数据段体积过大,超出emu8086加载普通DOS程序的默认内存分配限制,导致程序卡在数据加载阶段,无法进入代码段执行。
解决方案
根据你的需求可选择两种方案:
方案1:无多余填充,准确定位段内偏移(推荐)
不需要在数据段内插入org填充空隙,直接用equ伪指令指定变量的固定偏移,既不会生成多余的空字节,也能满足地址定位需求,修改后的代码如下:
data segment Count db 0AH data ends ; 直接指定变量的段内偏移地址 StuId equ 3500h Dest equ 3600h code segment assume cs:code, ds:data start: mov ax, data mov ds, ax mov cl, Count mov ch, 00h mov si, StuId mov di, Dest next: mov al, [si] mov [di], al inc si inc di loop next mov ah, 4ch int 21h code ends end start
方案2:保留段内org写法,调整变量顺序
如果必须在数据段内用org定义偏移,可调整变量顺序减少不必要的填充,只要数据段总大小不超过64KB,emu8086就可以正常加载:
data segment org 3500h Count db 0AH StuId db 1,2,3,4,5,6,7,8,9,0 org 3600h Dest db 10 dup(0) data ends code segment assume cs:code, ds:data start: mov ax, data mov ds, ax mov cl, Count mov ch, 00h lea si, StuId lea di, Dest next: mov al, [si] mov [di], al inc si inc di loop next mov ah, 4ch int 21h code ends end start
注意此方案下Count变量的段内偏移为3500h,而非原来的0偏移。
内容的提问来源于stack exchange,提问作者wiki zzz
相关产品推荐
相关产品推荐

