注册 登录
编程论坛 汇编论坛

16位汇编求助 关于21h中断 读写文件

发布于 2011-03-24 17:40, 1186 次点击
写发代码
;.asm

MyStack segment stack
    db 200 dup(0)
MyStack ends

MyData segment
    szFilePath db 'E:\1.txt'
    hNewFile   dw 0
    szBuf      db 200 dup(0)
MyData ends

include MyIO.inc

MyCode segment
    ;assume CS:MyCode, DS:MyData, SS:MyStack
start:
    mov ax,MyData
    mov ds,ax
   
    mov bx, offset szFilePath
    mov si, 2

    push si
    push bx
    call MyOpenFile
    add sp, 4
    test ax, 0ff00h     ;检查返回值高字节是否是-1
    jnz _ERROR          ;zf = 0  表示高位是-1

    mov bx, offset hNewFile
    mov WORD ptr [bx], ax

    mov di, offset szBuf
    mov cx, 20

    push cx
    push di
    push ax
    call MyReadFile
    add sp, 6
   
   
_ERROR:   
    ;暂停,任意键关闭
    mov ah,1
    int 21h
    mov ah,4ch     ;结束,可以修改al设置返回码
    int 21h

MyCode ends

    end start




;MyIO.inc

MyCode segment
  ;函数功能: 打开文件
  ;参数1:    strFilePath文件路径 以0结尾
  ;参数2:    wFlag, word类型 打开方式  
  ;返回:     成功:AH=0, Al=文件代号,   错误:AH = FF  AL=错误码
  MyOpenFile proc far
    strFilePath equ bp+6        ;;宏替换 第1个参数
    wFlag       equ bp+8        ;;第2个参数
      push bp
      mov bp, sp
      push dx
   
      mov dx, [strFilePath]
      mov al, [wFlag]

      mov ah, 3dh
      int 21h
      jcxz _OK          ;CF=0表示成功
      mov ah, 0FFh
_OK:
      pop dx
      mov sp, bp
      pop bp
      ret
  MyOpenFile endp
MyCode ends


在执行打开文件函数的时候 3d功能号   CF = 1  调用失败了。 我郁闷啊

我在程序目录建立了一个文件1.txt   百思不得其解啊
8 回复
#2
ansic2011-03-24 23:01
楼主看的什么教材? 咋那么复杂?
#3
2011-03-24 23:14
没看什么教材啊  啊门   我只是想自己封装几个函数而已


把什么文件打开 关闭 读写 移动文件指针  这些函数都封装一下而已

但是有问题啊。他奶奶的
#4
ansic2011-03-24 23:52
干嘛 要把挺简单的问题复杂化呢
#5
2011-03-25 00:44
额  只是这样封装起来  自己用的顺手   直接调用函数就好。嘿嘿

问题挺头疼的。 一会好使  一会又不好使。我在继续调调  感谢楼上
#6
zaixuexi2011-03-25 01:09
1.szFilePath db 'E:\1.txt' ->szFilePath db 'E:\1.txt',0
2.jcxz _OK          ;CF=0表示成功 -> jcxz和cf有什么关系?
#7
ansic2011-03-25 10:46
以下是引用zaixuexi在2011-3-25 01:09:32的发言:

1.szFilePath db 'E:\1.txt' ->szFilePath db 'E:\1.txt',0
2.jcxz _OK          ;CF=0表示成功 -> jcxz和cf有什么关系?

版主好眼力!

1
windows/dos文件名总是按照ASCII-Z串存储的,他是一个以空字符(00H)位结束符的字符串。
2
mov ah, 3dh
int 21h
jc error ;
dos对文件功能的调用总是通过检查CF来作为文件操作成功与否的出口参数,
如果cf=1,则表示打开文件出错。错误代码在AX里。
如果cf=0,则表示打开成功,文件句柄放在AX里。
而jcxz则是检查cx是否为零。

[ 本帖最后由 ansic 于 2011-3-25 10:49 编辑 ]
#8
zaixuexi2011-03-25 11:26
回7楼,我昨天上机调试过的
#9
2011-03-25 16:48
第一个问题  没事  因为我数据全是0   所以已经以0结尾了

当然 程序肯定也得改一下    还有那个jcxz  是我查指令表  查到的

他写的是如果CF=0就跳转  所以就用了。 哎


这16位汇编太不给力了  哎哎哎    问题没找到  不过。又好用了  天知道是怎么回事
1