请教高手!!!

beakham 2003-06-21 04:25:30
1,编写程序,带两个参数READ/WRITE和文件名,能将CMOS RAM中的所有数据保存到指定文件中,或从指定文件恢复CMOS RAM中的内容。
2,类似1,但保存或恢复硬盘主引导扇区(0道0面1扇区)及C盘引导记录(C盘0号逻辑扇区)中的内容。
3,编写一个通用程序,能为一个已存在的COM文件增加一些代码(如运行时先问口令,回答正确才能继续运行原COM程序)。

三道题目,请高手们帮我做一下,随便哪一道,小弟先谢谢了。



(汇编真烦啊!!)
...全文
53 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
BraveHeart2222 2003-07-05
  • 打赏
  • 举报
回复
....
push cs ;加上这两句
pop ds
mov si,80h ;在CS:80H处是命令行参数的长度
lodsb ;将DS:80H处的命令行参数长度送给寄存器AL
mov cl,al
xor ch,ch
or al,al ;看AL是否为0,为0表示无参数
jnz next
jmp exit_p ;no para,exit
next:
inc si
lodsb
cmp al,'' ;看AL是否为空格
jnz judgepara ;不是空格转
loop next ;是空格则继续取下一个字符
BraveHeart2222 2003-06-22
  • 打赏
  • 举报
回复
第一题不是很难,思路是:
将要读的地址送70H端口,然后数据送al,再将AL的值送71H端口,再循环,如:
从CMOS读数据:
mov cx,n ;n是要读的字节数
mov al,addr ;addr是要从CMOS的什么地方开始读,
;比如要从CMOS的第16个字节开始读,
;则用10H代替addr
readloop:
out 70h,al
push ax
in al,71h
mov ds:[bx],al ;bx是存放读出来的数据的缓冲区地址
pop ax
inc bx
inc al ;CMOS的下一个地址
loop realoop
向CMOS写数据:
mov ax,addr ;addr是要写到CMOS的什么地址
mov cx,n ;n是要写的字节数
cld
writeloop:
out 70h,al
push ax
mov al,[bx] ;bx是存放要写到CMOS去的数据的缓冲区地址
out 71h,al
pop ax
inc al
inc bx
loop writeloop
std
BraveHeart2222 2003-06-22
  • 打赏
  • 举报
回复

2.保存或恢复硬盘主引导扇区,用法:
1)保存硬盘主引导扇区: 本文件名 /w
2)恢复硬盘主引导扇区: 本文件名 /r


data segment
buff db 512 dup(0)
filename db 'mbr.dat',0
creatfileerr db 'Create file error!','$'
openerr db 'Open file error!','$'
writerr db 'Write file error!','$'
readerr db 'Read file error!','$'
writeokmsg db 'Write file OK!','$'
paramerr db 'The param is invalid!','$'
data ends

code segment
assume cs:code,ds;data
start:
mov ax,data
mov ds,ax
cld
mov si,80h
lodsb
mov cl,al
xor ch,ch
or al,al ;have para?
jz exit_p ;no para,exit
next:
inc si
lodsb
cmp al,''
jnz judgepara
loop next
judgepara:
cmp al,'/'
jnz paraerr
lodsb
cmp al,'r'
jz readmbr
cmp al,'w'
jz writembr
paraerr:
lea dx,paramerr
jmp message
readmbr:
mov ax,0201h
lea bx,buff
mov cx,01h
mov dx,0080h
int 13h
lea dx,filename
mov cx,0
mov ah,3ch
int 21h
jc createfileerr
mov bx,ax
lea dx,buff
mov cx,0200h
mov ax,40h
int 21h
jc writefileerr
mov ah,3eh
int 21h
jmp writefileok
createfileerr:
lea dx,creatfileerr
jmp message
writefileerr:
lea dx,writerr
jmp message
writefileok:
lea dx,writeokmsg
jmp message
writembr:
lea dx,filename
mov ax,3d00h
mov cx,0
int 21h
jc openfileerr
mov bx,ax
mov cx,0200h
lea dx,buff
push dx
mov ah,3fh
int 21h
jc readfileerr
mov ah,3eh
int 21h
pop bx
mov ax,0301h
mov cx,0001h
mov dx,0080h
int 13h
openfileerr:
lea dx,openerr
jmp message
readfileerr:
lea dx,readerr
message:
mov ah,09h
int 21h
exit_p:
mov ah,4ch
int 21h
code ends
end start


紫郢剑侠 2003-06-22
  • 打赏
  • 举报
回复
1 要通过读写端口来实现

2 主要是调用INT 13H

3 到asm.yeah.net找罗云彬上世纪写的一个程序(附带有源代码),其中有你所需要的功能。

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧