Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly FCB和Int 21h/功能23h_Assembly_Dos_X86 16_Tasm_16 Bit - Fatal编程技术网

Assembly FCB和Int 21h/功能23h

Assembly FCB和Int 21h/功能23h,assembly,dos,x86-16,tasm,16-bit,Assembly,Dos,X86 16,Tasm,16 Bit,我需要使用Int 21h/function 23h获得文件大小。我不知道FCB是如何工作的,也不知道如何使用它。本节中给出的功能23h说明如下: 函数23h(35)使用FCBs获取文件大小 Returns the number of records in a file. On entry: AH 23h DS:DX Pointer to an unopened FCB Returns: AL

我需要使用Int 21h/function 23h获得文件大小。我不知道FCB是如何工作的,也不知道如何使用它。本节中给出的功能23h说明如下:

函数23h(35)使用FCBs获取文件大小

Returns the number of records in a file.

  On entry:      AH         23h
                 DS:DX      Pointer to an unopened FCB

  Returns:       AL         00h      If matching file found
                            FFh      If no matching file found

我该如何使用它?

您链接到的同一页的底部有一个链接。如果您遵循它,您将看到您需要为FCB初始化一个内存块,并用驱动器号(03代表C:)、8.3格式的文件名和几个其他字段填充它。将ds:dx点指向该内存块,将ah设置为23h,并
int21
。如果al为0,则成功,您可以从ds:dx+10h获得文件长度

请参见偏移量0x10处与指定文件大小匹配的
b2 6a 00

jcomeau@aspire:/tmp$ ls -l /usr/src/dosdebug/DEBUG.TXT
-rw-r--r-- 1 jcomeau jcomeau 27314 Feb 15  2014 /usr/src/dosdebug/DEBUG.TXT
jcomeau@aspire:/tmp$ printf '%x\n' 27314
6ab2
我必须修补dosbox中的一个bug才能让它工作,因此更新速度很慢

diff -up ./include/dos_inc.h.orig ./include/dos_inc.h
--- ./include/dos_inc.h.orig    2015-12-27 12:43:12.000000000 -0800
+++ ./include/dos_inc.h 2015-12-27 11:53:19.000000000 -0800
@@ -170,7 +170,7 @@ void DOS_BuildUMBChain(bool umb_active,b
 bool DOS_LinkUMBsToMemChain(Bit16u linkstate);

 /* FCB stuff */
-bool DOS_FCBOpen(Bit16u seg,Bit16u offset);
+Bit16u DOS_FCBOpen(Bit16u seg,Bit16u offset);
 bool DOS_FCBCreate(Bit16u seg,Bit16u offset);
 bool DOS_FCBClose(Bit16u seg,Bit16u offset);
 bool DOS_FCBFindFirst(Bit16u seg,Bit16u offset);
diff -up ./src/dos/dos_classes.cpp.orig ./src/dos/dos_classes.cpp
diff -up ./src/dos/dos_files.cpp.orig ./src/dos/dos_files.cpp
--- ./src/dos/dos_files.cpp.orig    2015-12-27 10:08:26.000000000 -0800
+++ ./src/dos/dos_files.cpp 2015-12-27 12:22:17.000000000 -0800
@@ -964,7 +964,7 @@ bool DOS_FCBCreate(Bit16u seg,Bit16u off
    return true;
 }

-bool DOS_FCBOpen(Bit16u seg,Bit16u offset) { 
+Bit16u DOS_FCBOpen(Bit16u seg,Bit16u offset) { 
    DOS_FCB fcb(seg,offset);
    char shortname[DOS_FCBNAME];Bit16u handle;
    fcb.GetName(shortname);
@@ -972,7 +972,7 @@ bool DOS_FCBOpen(Bit16u seg,Bit16u offse
    /* First check if the name is correct */
    Bit8u drive;
    char fullname[DOS_PATHLENGTH];
-   if (!DOS_MakeName(shortname,fullname,&drive)) return false;
+   if (!DOS_MakeName(shortname,fullname,&drive)) return (Bit16u)false;

    /* Check, if file is already opened */
    for (Bit8u i=0;i<DOS_FILES;i++) {
@@ -982,16 +982,16 @@ bool DOS_FCBOpen(Bit16u seg,Bit16u offse
            if (handle==0xFF) {
                // This shouldnt happen
                LOG(LOG_FILES,LOG_ERROR)("DOS: File %s is opened but has no psp entry.",shortname);
-               return false;
+               return (Bit16u)false;
            }
            fcb.FileOpen((Bit8u)handle);
-           return true;
+           return handle;
        }
    }

    if (!DOS_OpenFile(shortname,OPEN_READWRITE,&handle)) return false;
    fcb.FileOpen((Bit8u)handle);
-   return true;
+   return handle;
 }

 bool DOS_FCBClose(Bit16u seg,Bit16u offset) {
@@ -1181,11 +1181,12 @@ bool DOS_FCBGetFileSize(Bit16u seg,Bit16
    char shortname[DOS_PATHLENGTH];Bit16u entry;Bit8u handle;Bit16u rec_size;
    DOS_FCB fcb(seg,offset);
    fcb.GetName(shortname);
-   if (!DOS_OpenFile(shortname,OPEN_READ,&entry)) return false;
+   if (!(entry = DOS_FCBOpen(seg, offset))) return false;
    handle = RealHandle(entry);
    Bit32u size = 0;
    Files[handle]->Seek(&size,DOS_SEEK_END);
-   DOS_CloseFile(entry);fcb.GetSeqData(handle,rec_size);
+   fcb.GetSeqData(handle,rec_size);
+   DOS_CloseFile(entry);
    Bit32u random=(size/rec_size);
    if (size % rec_size) random++;
    fcb.SetRandom(random);
diff-up./include/dos_inc.h.orig./include/dos_inc.h
---/include/dos_inc.h.orig 2015-12-27 12:43:12.000000000-0800
+++/include/dos_inc.h 2015-12-27 11:53:19.000000000-0800
@@-170,7+170,7@@void DOS_BuildUMBChain(bool umb_active,b
bool DOS_linkumbstomchain(Bit16u linkstate);
/*FCB材料*/
-bool DOS_FCBOpen(位16u seg,位16u offset);
+位16U DOS_FCBOpen(位16U seg,位16U偏移);
bool DOS_FCBCreate(位16u seg,位16u offset);
bool DOS_FCBClose(位16u seg,位16u offset);
bool DOS_FCBFindFirst(位16u seg,位16u offset);
diff-up./src/dos/dos_classes.cpp.orig./src/dos/dos_classes.cpp
diff-up./src/dos/dos_files.cpp.orig./src/dos/dos_files.cpp
---/src/dos/dos_files.cpp.orig 2015-12-27 10:08:26.000000000-0800
+++/src/dos/dos_files.cpp 2015-12-27 12:22:17.000000000-0800
@@-964,7+964,7@@bool DOS_fcb创建(位16u seg,位16u off
返回true;
}
-bool DOS_FCBOpen(位16u seg,位16u offset){
+位16U DOS_FCBOpen(位16U seg,位16U偏移量){
DOS_FCB FCB(分段、偏移);
字符短名称[DOS_FCBNAME];位16u句柄;
fcb.GetName(短名称);
@@-972,7+972,7@@bool DOS_FCBOpen(位16u seg,位16u offse
/*首先检查名称是否正确*/
比特8U驱动器;
字符全名[DOS_路径长度];
-如果(!DOS_MakeName(shortname、fullname和drive))返回false;
+如果(!DOS_MakeName(shortname、fullname和drive))返回(Bit16u)false;
/*检查文件是否已打开*/
用于(Bit8u i=0;iSeek(&size,DOS\u SEEK\u END);
-DOS_CloseFile(条目);fcb.GetSeqData(句柄、记录大小);
+fcb.GetSeqData(句柄、记录大小);
+DOS_关闭文件(条目);
比特32U随机=(大小/记录大小);
if(大小%rec_大小)随机++;
fcb.SetRandom(随机);

请编辑问题并添加您正在考虑的硬件和操作系统。问得太晚了32年,FCBs在1983年就过时了。首先使用所有必需的信息初始化an(我相信文档的其他部分中也有这样的示例),然后调用int 21h。