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

麻烦请问一下怎么让汇编语言做到类似于c++中的文件流读入写出

oped02 发布于 2022-11-22 12:48, 2883 次点击
汇编语言怎么才能像c++的文件流那样
直接从一个文件读入然后放置在汇编程序中对应的寄存器中
例如在汉诺塔问题中:
N:也就是盘子数,bx用来存储N
x:起始轴,所有的盘子最初放在上面,cx用来存储x轴名字
y:中转轴,si用来存储y轴名字
z:目标轴,di用来存储z轴名字

我现在能做到将文件中的一个数读入且放置在bx中,但后面如何读入就难以下手。
4 回复
#2
oped022022-11-22 12:50
只有本站会员才能查看附件,请 登录
#3
Valenciax2022-11-22 18:43
档案只能读入到缓冲区,然后再到该地址存取.
假若档案名称:HANOI.TXT,内容第1行是数目N,第2~4是名称,如下.

12
M
N
E

HANOI.TXT自行建立,必须以ANSI编码存档

程式可以这样修改...

1.
datarea        ends
之上加4行

    constant    dw    10000,1000,100,10,1

    FileName    db    'hanoi.txt',0    ;档名
    UserNumber    dw     0        ;数目
    UserName    db     0,0,0        ;名称
    Buffer        db    20 dup (?)    ;读入缓冲   
   
datarea        ends


2.
整个main替换成这个
程序代码:

;***************************************************************
main        proc    far
    assume cs:prognam,ds:datarea

start:
;set DS register to current data segment
    mov    ax,datarea
    mov    ds,ax
    mov    es,ax

;MAIN PART OF PROGRAM GOES HERE
;
    mov     ax,3d00h        ;开档只读(read only)
    mov     dx,offset FileName    ;档名
    int    21h            ;调用DOS
    jc    exit            ;开启错误则离开
    mov     bx,ax            ;取Handle
    mov     ah,3fh            ;读档
    mov     cx,20            ;长度
    mov     dx,offset Buffer    ;读入地址   
    int     21h            ;调用dos
    jc    exit            ;读取错误则离开
    cld                ;正向
    mov     di,offset Buffer    ;读入缓冲   
    mov    ax,[di]            ;取第一个word
    cmp    ah,0dh            ;是否换行符
    jnz    @f            ;不是
    mov    ah,'0'            ;取代换行符
    jmp    short next        ;
@@:    xchg    ah,al            ;若第1行是'12',读入ax后,al=32H,ah=31H,须交换
next:    sub     ax,3030h        ;若'12',读入交换后AX=3132H,减后AX=0102,此即BCD码
    aad                ;BCD调整,若AX=0102,AAD后,AX=000C
    mov    UserNumber,ax        ;保存
    mov    bx,0            ;初始化   
    mov     cx,20            ;长度
    mov    al,0Ah            ;换行符
@@:
    repnz    scasb            ;扫瞄ES:DI数组CX次,有否AL,若有AL或CX=0则停
    mov    ah,[di]            ;取换行符后的名称
    mov     UserName[bx],ah        ;存入名称
    inc    bx            ;下一个
    cmp     bx,3            ;是否3个
    jb    @b            ;未完
    xor     ax,ax            ;AX=0
    xor     cx,cx            ;CX=0
    mov    cl,UserName        ;取第1名称
    mov    al,UserName+1        ;取第2名称
    mov     si,ax            ;
    mov    al,UserName+2        ;取第3名称
    mov     di,ax            ;
    mov    bx,UserNumber        ;取数目
;
    call    hanoi            ;call HANOI( N,X,Y,Z )
exit:
    mov     ah,4ch
    int    21h

main    endp

;***************************************************************




其它不必改.....




[此贴子已经被作者于2022-11-23 18:45编辑过]

#4
oped022022-11-23 11:24
谢谢版主,我原本还只想得到一点提示呢
昨天晚上没上论坛想了很久,结果还是没有眉目
今天一上线就看见版主大大如此详细的解说
#5
Valenciax2022-11-23 18:46
顺带一提,和档案相关的函式主要有:ah=3ch(建立)ah=3dh(开启),3fh(读取),3eh(关闭),40h(写入),41h(删除),42h(移动指针)
这里42h的移动指针,就是说,读档不一定要由档头最前读起,可以是任意位置(由cx:dx组成的32bit长度决定)开始读.
另外,上面4楼的代码中,读完档后,应该有一个关档动作,就是
mov ah,3eh
mov bx,handle
int 21h

当然,不关好像也没啥问题,其实是离开程式返回dos时,系统会把程式所有开启的档案关闭,不然,人人都开档不关,handle都不够用.


1