标题:麻烦请问一下怎么让汇编语言做到类似于c++中的文件流读入写出
只看楼主
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
结帖率:100%
已结贴  问题点数:20 回复次数:4 
麻烦请问一下怎么让汇编语言做到类似于c++中的文件流读入写出
汇编语言怎么才能像c++的文件流那样
直接从一个文件读入然后放置在汇编程序中对应的寄存器中
例如在汉诺塔问题中:
N:也就是盘子数,bx用来存储N
x:起始轴,所有的盘子最初放在上面,cx用来存储x轴名字
y:中转轴,si用来存储y轴名字
z:目标轴,di用来存储z轴名字

我现在能做到将文件中的一个数读入且放置在bx中,但后面如何读入就难以下手。
搜索更多相关主题的帖子: 存储 c++ 文件流 读入 汇编语言 
2022-11-22 12:48
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
得分:0 
hanoi.rar (2.13 KB)
2022-11-22 12:50
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
档案只能读入到缓冲区,然后再到该地址存取.
假若档案名称: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编辑过]

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

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


2022-11-23 18:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510734-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014396 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved