关于emu8086中INT 21H/42H中断对文件指针的移动
问题遇到的现象和发生背景
在用emu8086,使用 INT 21H/42h中断,移动文件指针,然后对文件进行写操作的时候,发现有时不能移动到我想要的位置。
于是我查找了emu8086的help文档
这里说,CX:DX代表我想要文件指针移动到的位置,如果成功,那么DX:AX将是成功移动到的位置
于是我再次运行检查dx:ax,分别给cx、dx赋上我想要的值,运行后检查dx、ax
令cx、dx都等1,执行中断前:
执行中断后:
即,cx:dx(我想要移动的位置)原本为0001:0001,执行后dx:ax(实际移动的位置)0000:0101;从这里看起来,101=1*100+1,cx:dx=cx 左移八位 再加上dx
再令cx=1,dx=10h,
执行前:
执行后:
即,cx:dx(我想要移动的位置)为0001:0010,执行后dx:ax(实际移动的位置)0000:1010;这里看起来,1010=1*1000+10,cx:dx=cx左移十二位再加上dx
关于8086里的0000:0000,没记错的话,是前者左移四位,再加后者?
而后我又多测试了几组数据:
cx | dx | position | true? | 执行前cx:dx | 执行后dx:ax |
---|---|---|---|---|---|
1 | 1 | 256+1 | T | 0001:0001 | 0000:0101 |
1 | 10 | 256+10 | T | 0001:000A | 0000:010A |
2 | 9 | 512+9 | T | 0002:0009 | 0000:0209 |
0 | 89h | 137 | T | 0000:0089 | 0000:0089 |
1 | 89h | 4233 | F | 0001:0089 | 0000:1089 |
1 | 137 | 4233 | F | 0001:0089 | 0000:1089 |
1 | 10h | 4112 | F | 0001:0010 | 0000:1010 |
0 | 109h | 16+9 | F | 0000:0109 | 0000: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调试。
我想要知道到底是什么问题,我能怎样把文件指针移动到我需要的位置?