当前位置: 代码迷 >> 汇编语言 >> 小弟我是新手,写了一个简单的程序,但在对文件进行新建以及读写的那一块有点有关问题,求大家指教
  详细解决方案

小弟我是新手,写了一个简单的程序,但在对文件进行新建以及读写的那一块有点有关问题,求大家指教

热度:8592   发布时间:2013-02-26 00:00:00.0
我是新手,写了一个简单的程序,但在对文件进行新建以及读写的那一块有点问题,求大家指教
有好几个问题,请大家耐心解答
;描述:
;此程序是模拟一个简单的银行系统,有查询余额,存钱,取钱和退出功能
;金额存储在文件bank.txt中,程序一开始会将bank.txt中的内容读取出来,存在x中(若无此文件,则新建)
;程序结束时,将x中的值写入回bank.txt文件中

;问题:
;1.我用的是emu8086编译器,若我一开始没有在给出的目录里建立bank.txt文件,则会提示无法打开,并没有新建文件
;2.即使我事先在给出的目录里建立了一个bank.txt文件,但是运行完程序后,里面内容并没有改变
;3.我事先在给出的目录里建立了一个bank.txt文件,里面打了一个数字0,调用将x十进制显示的query函数后,为什么还是显示出ASC码48
;4.我在save以及take中都有对输入的数进行判断是否大于9999,但是实际输入的时候我输入大于9999的数,仍然会继续让你输入下去,直到按回车键


;最好能帮我改下程序,达到我想要的功能,或者给我些修改意见
;emu8086编译通过,可以直接运行(如果没有自己建立文件,会提示打开文件失败)



data segment
        menu db  'Bank System:',13,10
             db  '1.query',13,10
             db  '2.save',13,10
             db  '3.take',13,10
             db  '4.exit',13,10
             db  'Please choose an order:',13,10,'$'
cr   db  13,10,'$'
error db 'error!',13,10,'$'
money  db  'money:','$'
number db 'number:',13,10,'$'
x      dw   0   ;用来存放从文件中读取出来的字符
path   db 'D:\emu8086\MyBuild\bank.txt',00 ;文件的绝对地址
codename db 10 dup(0) ;用来保存文件代号
data ends


code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
        call file_open  ;打开文件
call file_read  ;将文件内容读取至x中
call file_close ;关闭文件     
list:
lea dx,cr
mov ah,9
int 21h
lea dx,menu
mov ah,9
int 21h ;显示菜单
mov ah,1
int 21h
cmp al,'1' 
jnz a1     ;输入1,调用query,显示x中的数,以十进制显示
call query
jmp list
a1: cmp al,'2'
jnz a2 ;输入2,调用save,对x中的数据进行操作(加法)
call save
jmp list
a2: cmp al,'3'
jnz a3 ;输入3,调用take,对x中的数据进行操作(减法)
call take
jmp list
a3: cmp al,'4'
jz e ;输入4,调用exit,退出程序
lea dx,error
mov ax,9
int 21h
jmp list
e: call file_open  ;打开文件
call file_write ;将x中的数写入到文件中
call file_close ;关闭文件
call exit       ;退出程序

query proc ;以十进制显示内存x中的数
 call cr_lf ;回车+换行
 lea dx,money ;我是新手,这个子程序从网上找的,试了下似乎没有问题,目前没完全理解,所以没有注释
mov ah,9
int 21h
 mov ax,x
 xor cx,cx
 mov bx,10
nx1:
 xor dx,dx
 div bx
 or dx,0e30h
 inc cx
 push dx
 cmp ax,0
 jnz nx1
nx2: pop ax
 int 10h
 loop nx2
 ret
query endp

save proc ;读取内存x中的数,加上键盘键入的数,再回存至x中
mov ax,0
push ax ;初始化ax,并放入堆栈保护起来
save_loop:
call cr_lf ;回车+换行
lea dx,number ;显示"number:"
mov ah,9
int 21h
save_in:
mov ah,1
int 21h ;输入一个字符
cmp al,13 ;输入的若是回车,则结束输入
je save_end
cmp al,'0'
  相关解决方案