关于emu8086中INT 21H/42H中断对文件指针的移动

关于emu8086中INT 21H/42H中断对文件指针的移动

问题遇到的现象和发生背景

在用emu8086,使用 INT 21H/42h中断,移动文件指针,然后对文件进行写操作的时候,发现有时不能移动到我想要的位置。

于是我查找了emu8086的help文档

img

这里说,CX:DX代表我想要文件指针移动到的位置,如果成功,那么DX:AX将是成功移动到的位置

于是我再次运行检查dx:ax,分别给cx、dx赋上我想要的值,运行后检查dx、ax

令cx、dx都等1,执行中断前:

img

执行中断后:

img

即,cx:dx(我想要移动的位置)原本为0001:0001,执行后dx:ax(实际移动的位置)0000:0101;从这里看起来,101=1*100+1,cx:dx=cx 左移八位 再加上dx

再令cx=1,dx=10h,

执行前:

img

执行后:

img

即,cx:dx(我想要移动的位置)为0001:0010,执行后dx:ax(实际移动的位置)0000:1010;这里看起来,1010=1*1000+10,cx:dx=cx左移十二位再加上dx

关于8086里的0000:0000,没记错的话,是前者左移四位,再加后者?

而后我又多测试了几组数据:

cxdxpositiontrue?执行前cx:dx执行后dx:ax
11256+1T0001:00010000:0101
110256+10T0001:000A0000:010A
29512+9T0002:00090000:0209
089h137T0000:00890000:0089
189h4233F0001:00890000:1089
11374233F0001:00890000:1089
110h4112F0001:00100000:1010
0109h16+9F0000:01090000:0019

cx,dx是我给cxdx赋的值,position是执行完成后,实际在文件中,开始写的位置,true代表是否写道了我想要的位置。

问题相关代码,请勿粘贴截图

测试代码很简单,如下,是在写另一个程序时,发现文件指针没能移动到需要的位置,然后做了这个简单的程序来看看情况

; multi-segment executable file template.

data segment
    ; add your data here!
    file db 'C:\input.txt', 0   ;这里的C是emu8086安装目录下,vdrive里的C,不是c盘 
    pkey db "press any key11...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    ;打开文件,读写
    mov al, 2
    mov dx, offset file
    mov ah, 3dh
    int 21h    
    mov bx, ax
    ;移动文件指针
    mov al, 0
    mov cx, 1  
    mov dx, 10h
    mov ah, 42h
    int 21h
    ;写数据
    mov cx, 16
    mov dx, offset pkey
    mov ah, 40h
    int 21h
            
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
    
    ; wait for any key....    
    mov ah, 1
    int 21h
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.

我不知道是我对cx:dx代表的位置理解错了,还是emu8086有问题,我尝试在masm上运行,更改格式后,成功运行,但是没有输出,也不会在masm调试。

我想要知道到底是什么问题,我能怎样把文件指针移动到我需要的位置?

在DosBox下测试一下

在masm里面测试好了(先前测试写错了一点代码)
设置cx:dx 最后的结果很稳定,应该没有bug
假设cx:dx = 0001:0001
结果为65537 65536+1,即 cx左移16位,加dx
cx是dx的拓展
类似于mul指令,dx与ax的关系
另外多测试了几组数据,都是这样
emu8086这个文件指针,是有bug的
对了,我用的emu8086是4.08版,仅供参考
emu8086还有些许其他bug,我还确认了一个,其他的不太清楚了
但是最后吐槽一下
emu8086感觉比masm看起来舒服好多,其他汇编编译器看着也都好难受

贴上代码

.model small

.data
    ; add your data here!
    file db 'input.txt', 0 
    pkey db "press any key...$"


.stack
    dw   128  dup(0)


.code
start:
; set segment registers:
    mov ax, @data
    mov ds, ax
    mov es, ax
    
    
    
    mov al, 2
    mov dx, offset file
    mov ah, 3dh
    int 21h
    
    mov bx, ax
    
    mov al, 0
    mov cx, 1  ;成功验证1个cx代表后移256个字符
    mov dx, 10h
    mov ah, 42h
    int 21h
    
    mov cx, 16
    mov dx, offset pkey
    mov ah, 40h
    int 21h


    
    mov ax, 4c00h ; exit to operating system.
    int 21h    


end start ; set entry point and stop the assembler.

没什么问题