关于 王爽的汇编语言的课程设计2 小弟不懂请教各位大侠指教!

fhh0366 2007-07-20 11:30:06
以下是小弟写的汇编,关于王爽的汇编语言的课程设计2我还没把时间的设置写出来!想先调试一下大致的程序可以下小弟写的代码怎么也不能转换成EXE格式!用 masm的link 转换 提示说 LINK warning L4021: no stack segment 网上查了资料说没有设置堆栈!我在后来的调试中也尝试加进堆栈,可无论加在哪儿都是一样的问题!请教各位大侠指点一下!程序中那些地方错误和不足也麻烦能指出来!小弟我刚学汇编!如果那位有 王爽的汇编语言的课程设计2 的正确答案 麻烦能告诉我! 小弟在此拜谢了!









assume cs:code

code segment
start:lea ax,acc
mov es,ax
mov bx,0
mov al,1
mov dh,0
mov ch,0
mov cl,2
mov dl,0
mov ah,3
int 13h
mov ax,4c00h
int 21h



acc:
mov ax,cs
mov ds,ax
mov si,offset int9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb

mov ax,es:[9*4]
mov es:[200h],ax
mov ax,es:[9*4+2]
mov es:[202h],ax
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti


s: in al,60h
cmp al,2
je resetpc ;重起
cmp al,3
je startsystem ;引导现有的操作系统
cmp al,4
je clock ;时钟显示
jmp short s

resetpc:

mov ax,0ffffh
push ax
mov ax,0
push ax
retf

startsystem:
mov ax,0
mov es,ax
mov bx,7c00h
mov dh,0 ;磁盘面
mov ch,0 ;磁道号
mov cl,1 ;扇区号
mov al,1 ;扇区数
mov ah,0 ;读
mov dl,80h ;驱动器号(C盘)
int 13h
pushf
mov ax,0
push ax
mov ax,7c00h
push ax
iret

clock:
push si
push bp
push dx

mov si,0
mov dl,4
mov dh,9
mov bp,18
mov cx,3

s1: push cx
mov al,dh
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h

mov bx,0b800h
mov es,bx

mov byte ptr es:2000[si],ah
mov byte ptr es:2000[si+2],al

mov al,dl
out 70h,al
in al,71h
mov ah,al
shr ah,cl
and al,00001111b
add ah,30h
add al,30h


mov byte ptr es:2000[bp+si],ah
mov byte ptr es:2000[bp+si+2],al


add si,6
sub dl,2
sub dh,1
pop cx

loop s1
pop dx
pop bp
pop si

mov byte ptr es:[2004],'/'
mov byte ptr es:[2010],'/'

mov byte ptr es:[2022],':'
mov byte ptr es:[2028],':'



in al,60h

cmp al,0 ;esy键的扫描码

je quit

jmp clock
;以上4句为动态获取系统时间的关键

quit: jmp near ptr s

int9: push ax

push bx

push es

in al,60h

pushf

call dword ptr cs:[200]

cmp al,3bh

jne int9ret

mov ax,0b800h

mov es,ax

inc byte ptr es:[2005]
inc byte ptr es:[2011]

inc byte ptr es:[2023]
inc byte ptr es:[2029]

inc byte ptr es:[1971]
inc byte ptr es:[1973]
inc byte ptr es:[1975]
inc byte ptr es:[1979]
inc byte ptr es:[1981]
inc byte ptr es:[1983]
inc byte ptr es:[1987]
inc byte ptr es:[1989]
inc byte ptr es:[1991]

int9ret:pop es
pop bx
pop ax
iret
int9end:nop
accend:nop

code ends
end start
...全文
388 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
alan001 2007-07-25
  • 打赏
  • 举报
回复
Up
ReverseEngineering 2007-07-25
  • 打赏
  • 举报
回复
学习
beijingbeerman 2007-07-24
  • 打赏
  • 举报
回复
接上贴

;---显示CMOS时间--------------------------------
clock: mov cx,1000
showstart:push cx
call delay
call showTime
pop cx
loop showstart
ret


showTime:mov si,data
mov ds,si
mov si,0
mov dx,70h

mov cx,6
ss0:mov al,[si]
out dx,al
in al,71h
push ax
add si,2
loop ss0

mov ax,0b800h
mov ds,ax
mov dh,0 ;行号
mov dl,0 ;列号
mov cl,2 ;颜色

mov ax,160
mul dh
mov bx,ax

mov ax,2
mul dl
add bx,ax

mov si,0
mov cx,2
ss1:pop ax ;写年、月
mov di,cx ;保存循环次数
call getNum

mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl

mov byte ptr [bx+2],al
mov [bx+3],cl

mov byte ptr [bx+4],"/"
mov [bx+5],cl
add bx,6
mov cx,di
loop ss1


pop ax ;写日
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl

add bx,6 ;空格

ss2:pop ax ;写时、分
mov di,cx ;保存循环次数
call getNum

mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl

mov byte ptr [bx+2],al
mov [bx+3],cl

mov byte ptr [bx+4],":"
mov [bx+5],cl
add bx,6
mov cx,di
loop ss2

pop ax ;写秒
call getNum
mov byte ptr [bx],ah
mov cl,2
mov [bx+1],cl
mov byte ptr [bx+2],al
mov [bx+3],cl

ret


getNum:mov cl,4
mov ah,al
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
ret

;延时
delay:push ax
push dx
mov dx,1000h
mov ax,0
sss1:sub ax,1
sbb dx,0
cmp ax,0
jne sss1
cmp dx,0
jne sss1
pop dx
pop ax
ret

;------开始让用户输入日期----------------------------
getstr: push ax

getstrs: mov ah,0
int 16h


cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs

nochar: cmp ah,0eh ;如果是退格键
je backspace
cmp ah,1ch ;如果是回车键
je enter


backspace: mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs

enter: mov al,0 ;回车时把al中的0压入栈
mov ah,0
call charstack
mov ah,2
call charstack
call ChangTime ;调用改变CMOS时间函数
call clearscreen ;清屏
pop ax
jmp far ptr show0

charstack: jmp charstart
table dw charpush,charpop,charshow
top dw 0 ;栈的当前位置的公共变量。
array: db 60 dup (0)

charstart: push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah ;ah为暗号
mov bh,0
add bx,bx
jmp word ptr table[bx]

charpush: mov bx,top
mov si,offset array
mov cs:[si+bx],al
inc top
jmp sret

charpop: cmp top,0
je sret
dec top
mov bx,top
mov si,offset array
mov al,cs:[si+bx]
jmp sret

charshow: mov dh,6
mov dl,6
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx

mov bx,0 ;从头把栈中的数显示一遍。

charshows: cmp bx,top ;查看栈中是否有数据。
jne noempty
mov byte ptr es:[di],' '
jmp sret

noempty: mov si,offset array
mov al,cs:[si+bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows

sret: pop es
pop di
pop dx
pop bx
ret
;-----用户输入日期结束-------------------------
;-----更改CMOS中的时间-------------------------
ChangTime: push bx
push dx
push di
push es
cmp bp,18 ;如果长度不等于18就退出,不改CMOS
jne EndReturn

changclock: mov si,offset array ;得到栈坐标
mov bp,0

mov bx,data2
mov di,0
mov cx,6
changloop: mov dx,70h
mov al,[bx+di]
out dx,al
mov dx,71h
mov ax,cs:[si+bp] ;得到年在al
push cx ;保护cx
mov cl,4
shl ah,cl ;把年的十位移到高4位
pop cx
and al,00001111b ;把年的个位高4位清0
or al,ah ;把一个完整的年分合并到al一个字节中
out dx,al ;把年写入CMOS
inc bp
add di,2
loop changloop

EndReturn: pop es
pop di
pop dx
pop bx
ret
;-----更改时间结束-----------------------------

;清空屏幕。
clearscreen: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
subls: mov byte ptr es:[bx],' '
add bx,2
loop subls
pop es
pop cx
pop bx
ret
endsetup:nop

code ends
end start
beijingbeerman 2007-07-24
  • 打赏
  • 举报
回复
===============================================================================
第17章 课程设计2---未写入软盘
===============================================================================
课程设计2未能完全达到书上要求,在此抛砖引玉希望广大网友共同完善。



assume cs:code,ds:data
data segment
dw 0,2,4,7,8,9
db 128 dup (0)
data ends

data2 segment
dw 9,8,7,4,2,0
data2 ends

code segment
s0 db '1) reset pc ','$'

s1 db '2) start system ','$'

s2 db '3) clock ','$'

s3 db '4) set clock ','$'

s dw offset s0,offset s1,offset s2,offset s3

start:mov ax,code
mov ds,ax
show0:mov si,offset s ;ds dx显示字符串开始坐标。

mov bh,0 ;第0页
mov dh,2 ;行号
mov dl,6 ;列号

;----------显示4条选项------------------------------------
mov cx,4
show1:mov ah,2
int 10h ;设置光标

mov di,dx ;保存行号和列号。
mov dx,[si] ;显示字符串位置。
mov ah,9
int 21h ;显示行中第一条字符串


mov dx,di
inc dh
add si,2 ;为下一个循环显示data中字符串作准备。
loop show1
;------------显示4条选项结束--------------------------------


mov ah,0
int 16h

mov bx,data ;保存显示主菜单地址
mov es,bx
mov bx,16
mov word ptr es:[bx],0ffffh
mov word ptr es:[bx+2],0

cmp al,'1'
je reset

mov bx,data ;保存显示主菜单地址
mov es,bx
mov bx,16
mov word ptr es:[bx],7c00h
mov word ptr es:[bx+2],0

cmp al,'2'
je startSystem


cmp al,'4'
je setSystemClock

cmp al,'3'
je clock

mov ax,4c00h
int 21h

;重起
reset:mov ax,data
mov es,ax
jmp dword ptr es:[16]


;进入硬盘操作系统
startSystem:mov ax,0
mov es,ax
mov bx,7c00h ;读到内存中的地址。

mov dl,0080h
mov ah,2 ;读磁盘操作
mov dh,0 ;0盘面
mov ch,0 ;0磁道
mov cl,1 ;1扇区
mov al,1 ;只读一个扇区
int 13h

call reset

;----------显示更改CMOS时间用户输入提示-----------------------------
setSystemClock:jmp short dostart
db "5) Chang CMOS Clock,format si yy/mm/dd hh:nn:ss ",'$'

dostart:call clearscreen ;清屏
mov al,0
mov ah,2 ;设置光标
mov bh,0
mov dh,2
mov dl,2
int 10h

mov si,offset setSystemClock
mov ax,cs
mov ds,ax
add si,2
mov dx,si
mov ah,9
int 21h

call getstr ;调用让用户输入日期
fhh0366 2007-07-24
  • 打赏
  • 举报
回复
谢谢!收下了!慢慢研究研究!
fhh0366 2007-07-22
  • 打赏
  • 举报
回复
stack segment stack 为什么后面多了一个stack ??
呵呵,输错了

我试过只加 stack segment
db 100 dup(0)
stack ends
还是会有提示而
stack segment stack
db 100 dup(0)
stack ends

则没有警告提示了!后面的stack一定有它的含义!可书上也没有讲!那位大侠能告诉我?
fhh0366 2007-07-22
  • 打赏
  • 举报
回复
生成EXE文件需要编译(汇编)+链接两个过程:
第一步
c:\masm>masm z.asm
(一路回车生成z.obj)
第二步
c:\masm>link z.obj
(一路回车生成z.exe)
------------------------------------------------------
我知道要两步走!可就是在c:\masm>link z.obj(一路回车生成z.exe)这步没有生成EXE文件!本来我以往生成EXE文件的时候要是有错误的话就会提示第1行错误或者第5行错误什么的等等!可现在问题是一点反映也没有!我在第二步
c:\masm>link z.obj
按回车后直接就回到了

c:\>

这样了!很郁闷不知道是什么原因!

czlyc006 2007-07-21
  • 打赏
  • 举报
回复
谢谢 chzuping() 帮忙!我想问下 stack segment stack 为什么后面多了一个stack 一般的定义一段空间没有加后面这么一个!加了这一个是什么意思?还有在我的程序前面加上这段后虽然没有了以前提示要堆栈的警告可还是不能转换成EXE文件,比如我打c:\z.obj;回车后直接就回到了c:\> 也没有提示什么错误!完全不明白为什么会这样?再次麻烦大侠!
------------------------------------------------------
生成EXE文件需要编译(汇编)+链接两个过程:
第一步
c:\masm>masm z.asm
(一路回车生成z.obj)
第二步
c:\masm>link z.obj
(一路回车生成z.exe)
fhh0366 2007-07-21
  • 打赏
  • 举报
回复
谢谢 chzuping() 帮忙!我想问下 stack segment stack 为什么后面多了一个stack 一般的定义一段空间没有加后面这么一个!加了这一个是什么意思?还有在我的程序前面加上这段后虽然没有了以前提示要堆栈的警告可还是不能转换成EXE文件,比如我打c:\z.obj;回车后直接就回到了c:\> 也没有提示什么错误!完全不明白为什么会这样?再次麻烦大侠!
dongyi940333 2007-07-21
  • 打赏
  • 举报
回复
初学不对之处请原谅
dongyi940333 2007-07-21
  • 打赏
  • 举报
回复
还有在我的程序前面加上这段后虽然没有了以前提示要堆栈的警告可还是不能转换成EXE文件,比如我打c:\z.obj;回车后直接就回到了c:\> 也没有提示什么错误!??

不太明白你所说的意思,先将汇编源程序文件编译,然后连接,如果连接过程中没有出现错误,就得到了相应的EXE文件了.link z.obj

stack segment stack 为什么后面多了一个stack ??
呵呵,输错了
chzuping 2007-07-20
  • 打赏
  • 举报
回复
这个警告是你的程序里没有定义堆栈,一般情况下可以不用理会这个警告,用默认的堆栈就可以了.

2、加上如下定义:
stack segment stack
db 100 dup(0)
stack ends
放到程序最前面就可以了。

21,459

社区成员

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

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