- 【WIN32汇编教程】(第一课)配置出WIN32汇编的开发环境
- 欢迎加入编程论坛:www.ghostasm.com 我们提供大量工具和学习的资料。VIP3高级群:89366200
- 在学汇编的来加群
- 为什么因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正呢?
- 第6章 实验5 第二题
- 【WIN32汇编教程】(第四课)编写出第一个“hello ghosthouse”程序
- 【WIN32汇编教程】(第三课)了解win32汇编程序的基本结构
- 【WIN32汇编教程】(第二课)Makefile文件的编写和nmake工具的使用
- 欢迎加入编程论坛:www.ghostasm.com 我们提供大量工具和学习的资料。VIP3高级群:89366200
- 欢迎加入编程论坛:www.ghostasm.com 我们提供大量工具和学习的资料。VIP3高级群:89366200
[2011-05-03 12:17] 用自己的方法写的课程设计1
这个是我学习王爽汇编至今为止用的时间最久写的一个程序了,它比较综合,运用到了很多方法和语句,所以我坚持用自己的方法去完成它,哪怕写很久也要自己写,但是幸亏我思考了3天写出来了,哈哈 一直在整理自己的思路。也希望大家在写这个程序的时候不要去看别人写的,实在不行了才去看看人家的思路。
写这个代码给我带来的启示:在写程序的时候写想好要用到哪些子程序,子程序的参数靠哪些寄存器来传递,哪些参数是必须要有的,哪些可以把它在子程序里面定死,必须要有的也就是一些在不同情况下需要改变的参数,需要在主调程序里面进行改变的,比如我写的时候我就把显示缓存中的颜色给定死了,因为这里用不到他,我们的目的是把内存中的数字按格式显示在屏幕上。还有就是遇到困难的时候一定不能浮躁,要静心慢慢的调试,一般逻辑错误找起来比较困难,编译错误的话按masm上提示的行数去找一下就一般可以解决了。还有要注意细节,有可能会因为漏打了一个字母,而调用了另一个子程序,在差错的时候很不容易发现的。我就是这样的,因为这样你在找子程序的时候根本就找不到错的地方。希望大家也能顺利的完成这个设计。一起加油,明天是美好的!
assume cs:code,ds:data
;============================数据段=======================================
;----------------------------DATA--------------------------------------
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984' ;0
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994' ;
db '1995'
;-------------------------------------------------------------------------
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980 ;54h
dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;-------------------------------------------------------------------------
dw 3,7,9,13,28,38,130,220,476,770,1001,1442,2258,2793,4037,5635,8226 ;0a8h
dw 11542,14430,15257,17800
;-------------------------------------------------------------------------
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260 ;d2h
dw 304,333
data ends
;----------------------------DATA--------------------------------------
;----------------------------table--------------------------------------
table segment
db 16 dup (0)
table ends
;----------------------------table--------------------------------------
;============================数据段=======================================
code segment
start:mov ax,data
mov ds,ax ;设定要读取的数据在data段
mov si,0 ;设定数据的位置
mov dl,0 ;设定行
mov dh,0 ;设定列
mov cx,21
mov bl,4 ;设定字符数
s1:call show_word
add si,4
inc dl
loop s1
mov si,54h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,19 ;设置列
mov cx,21 ;设置循环
s2:call dword1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,4
inc dl
loop s2
mov si,0a8h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,49 ;设置列
mov cx,21 ;设置循环
s3:call word1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,2
inc dl
loop s3
mov si,0d2h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,69 ;设置列
mov cx,21 ;设置循环
s4:call word1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,2
inc dl
loop s4
mov ax,4c00h
int 21h
;---------------------------show_word-----------------------------------
;需读取的数据段地址为DS段寄存器,在调用的时候设置
;显示缓存的段地址用ES来设置
;si指向需读取数据的偏移地址,在调用的时候设置
;dl:传送行信息
;dh:传送列信息 下面用BX保存计算好的显示的首地址
;bl字符个数
;颜色默认绿色
show_word:push ax
push bx
push cx
push dx
push di
push si ;寄存器入栈
mov ax,0b800h
mov es,ax ;设置显存段地址
mov ch,0 ;这里设置循环次数
mov cl,bl ;
mov al,0a0h
mul dl
mov bx,ax ;计算出行坐标,用BX保存
mov al,2
mul dh
add bx,ax ;计算出列坐标,并用BX来存放显示的首坐标
show_word_s1:mov al,ds:[si] ;读取数据
mov es:[bx],al ;将数据传入显存
mov byte ptr es:[bx+1],2 ;设置颜色
inc si
add bx,2
loop show_word_s1
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;---------------------------show_word-----------------------------------
;----------------------------word1---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
word1:push ax
push bx
push cx
push dx
push si ;寄存器入栈
mov ax,data
mov ds,ax
mov ax,table
mov es,ax ;这里设置读取与写入的内存的段
mov bx,10 ;设置除数
mov di,0 ;设定写入的位置
mov ax,ds:[si] ;用ax读入字
word_s1:mov dx,0
div bx ;AX中存着商,dx中存放余数,dl中放着余数
add dl,30h ;转换成对应的字符
mov es:[di],dl ;将字符写入内存
inc di ;指向下一个内存单元
mov cx,ax ;商为了则跳出
jcxz word_ok
jmp short word_s1
word_ok:mov ax,di
mov bl,2
div bl ;al中存放着需要循环的次数
mov ch,0
mov cl,al ;设置循环
jcxz word_end ;判断cx中的循环次数是否为0,为0就不转换了
mov si,0
mov bx,di
dec bx
word_s2:mov al,es:[bx]
mov ah,es:[si]
mov es:[bx],ah
mov es:[si],al
inc si
dec bx
loop word_s2
word_end:pop si
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------word---------------------------------------
;----------------------------Dword---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
dword1:push ax
push bx
push cx
push dx
push si ;寄存器入栈
mov ax,data
mov ds,ax
mov ax,table
mov es,ax ;这里设置读取与写入的内存的段
mov bx,10 ;设置除数
mov di,0 ;设定写入的位置
mov dx,0
mov ax,ds:[si+2] ;读入高位被除数
div bx ;高位商在ax中,余数在DX中
mov cx,ax ;将高位商传到cx中
mov ax,ds:[si] ;读入低位被除数,高位被除数在DX中
div bx ;ax中是低位商,DX中是余数
dword_s1:add dl,30h
mov es:[di],dl ;将余数存数内存
inc di ;指向下一个内存单元
mov dx,0
push cx
add cx,ax
jcxz dword_ok
pop cx
push ax ;将低位商入栈
mov ax,cx ;读入高位商
div bx ;高位商在AX中,余数在DX中
mov cx,ax ;将高位商传到cx中
pop ax ;读入低位被除数,高位在DX中
div bx
jmp short dword_s1
dword_ok:pop cx
mov ax,di
mov bl,2
div bl ;al中存放着需要循环的次数
mov ch,0
mov cl,al ;设置循环
jcxz dword_end ;判断cx中的循环次数是否为0,为0就不转换了
mov si,0
mov bx,di
dec bx
dword_s2:mov al,es:[bx]
mov ah,es:[si]
mov es:[bx],ah
mov es:[si],al
inc si
dec bx
loop dword_s2
dword_end:pop si
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------Dword---------------------------------------
code ends
end start
写这个代码给我带来的启示:在写程序的时候写想好要用到哪些子程序,子程序的参数靠哪些寄存器来传递,哪些参数是必须要有的,哪些可以把它在子程序里面定死,必须要有的也就是一些在不同情况下需要改变的参数,需要在主调程序里面进行改变的,比如我写的时候我就把显示缓存中的颜色给定死了,因为这里用不到他,我们的目的是把内存中的数字按格式显示在屏幕上。还有就是遇到困难的时候一定不能浮躁,要静心慢慢的调试,一般逻辑错误找起来比较困难,编译错误的话按masm上提示的行数去找一下就一般可以解决了。还有要注意细节,有可能会因为漏打了一个字母,而调用了另一个子程序,在差错的时候很不容易发现的。我就是这样的,因为这样你在找子程序的时候根本就找不到错的地方。希望大家也能顺利的完成这个设计。一起加油,明天是美好的!
assume cs:code,ds:data
;============================数据段=======================================
;----------------------------DATA--------------------------------------
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984' ;0
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994' ;
db '1995'
;-------------------------------------------------------------------------
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980 ;54h
dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;-------------------------------------------------------------------------
dw 3,7,9,13,28,38,130,220,476,770,1001,1442,2258,2793,4037,5635,8226 ;0a8h
dw 11542,14430,15257,17800
;-------------------------------------------------------------------------
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260 ;d2h
dw 304,333
data ends
;----------------------------DATA--------------------------------------
;----------------------------table--------------------------------------
table segment
db 16 dup (0)
table ends
;----------------------------table--------------------------------------
;============================数据段=======================================
code segment
start:mov ax,data
mov ds,ax ;设定要读取的数据在data段
mov si,0 ;设定数据的位置
mov dl,0 ;设定行
mov dh,0 ;设定列
mov cx,21
mov bl,4 ;设定字符数
s1:call show_word
add si,4
inc dl
loop s1
mov si,54h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,19 ;设置列
mov cx,21 ;设置循环
s2:call dword1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,4
inc dl
loop s2
mov si,0a8h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,49 ;设置列
mov cx,21 ;设置循环
s3:call word1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,2
inc dl
loop s3
mov si,0d2h ;设置好将要读入数据的首地址
mov dl,0 ;设置行
mov dh,69 ;设置列
mov cx,21 ;设置循环
s4:call word1
mov bx,di ;设置字符个数
mov ax,table
mov ds,ax ;设定需要读取数据的段
push si
mov si,0
call show_word
pop si
add si,2
inc dl
loop s4
mov ax,4c00h
int 21h
;---------------------------show_word-----------------------------------
;需读取的数据段地址为DS段寄存器,在调用的时候设置
;显示缓存的段地址用ES来设置
;si指向需读取数据的偏移地址,在调用的时候设置
;dl:传送行信息
;dh:传送列信息 下面用BX保存计算好的显示的首地址
;bl字符个数
;颜色默认绿色
show_word:push ax
push bx
push cx
push dx
push di
push si ;寄存器入栈
mov ax,0b800h
mov es,ax ;设置显存段地址
mov ch,0 ;这里设置循环次数
mov cl,bl ;
mov al,0a0h
mul dl
mov bx,ax ;计算出行坐标,用BX保存
mov al,2
mul dh
add bx,ax ;计算出列坐标,并用BX来存放显示的首坐标
show_word_s1:mov al,ds:[si] ;读取数据
mov es:[bx],al ;将数据传入显存
mov byte ptr es:[bx+1],2 ;设置颜色
inc si
add bx,2
loop show_word_s1
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;---------------------------show_word-----------------------------------
;----------------------------word1---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
word1:push ax
push bx
push cx
push dx
push si ;寄存器入栈
mov ax,data
mov ds,ax
mov ax,table
mov es,ax ;这里设置读取与写入的内存的段
mov bx,10 ;设置除数
mov di,0 ;设定写入的位置
mov ax,ds:[si] ;用ax读入字
word_s1:mov dx,0
div bx ;AX中存着商,dx中存放余数,dl中放着余数
add dl,30h ;转换成对应的字符
mov es:[di],dl ;将字符写入内存
inc di ;指向下一个内存单元
mov cx,ax ;商为了则跳出
jcxz word_ok
jmp short word_s1
word_ok:mov ax,di
mov bl,2
div bl ;al中存放着需要循环的次数
mov ch,0
mov cl,al ;设置循环
jcxz word_end ;判断cx中的循环次数是否为0,为0就不转换了
mov si,0
mov bx,di
dec bx
word_s2:mov al,es:[bx]
mov ah,es:[si]
mov es:[bx],ah
mov es:[si],al
inc si
dec bx
loop word_s2
word_end:pop si
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------word---------------------------------------
;----------------------------Dword---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
dword1:push ax
push bx
push cx
push dx
push si ;寄存器入栈
mov ax,data
mov ds,ax
mov ax,table
mov es,ax ;这里设置读取与写入的内存的段
mov bx,10 ;设置除数
mov di,0 ;设定写入的位置
mov dx,0
mov ax,ds:[si+2] ;读入高位被除数
div bx ;高位商在ax中,余数在DX中
mov cx,ax ;将高位商传到cx中
mov ax,ds:[si] ;读入低位被除数,高位被除数在DX中
div bx ;ax中是低位商,DX中是余数
dword_s1:add dl,30h
mov es:[di],dl ;将余数存数内存
inc di ;指向下一个内存单元
mov dx,0
push cx
add cx,ax
jcxz dword_ok
pop cx
push ax ;将低位商入栈
mov ax,cx ;读入高位商
div bx ;高位商在AX中,余数在DX中
mov cx,ax ;将高位商传到cx中
pop ax ;读入低位被除数,高位在DX中
div bx
jmp short dword_s1
dword_ok:pop cx
mov ax,di
mov bl,2
div bl ;al中存放着需要循环的次数
mov ch,0
mov cl,al ;设置循环
jcxz dword_end ;判断cx中的循环次数是否为0,为0就不转换了
mov si,0
mov bx,di
dec bx
dword_s2:mov al,es:[bx]
mov ah,es:[si]
mov es:[bx],ah
mov es:[si],al
inc si
dec bx
loop dword_s2
dword_end:pop si
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------Dword---------------------------------------
code ends
end start
评论次数(0) |
浏览次数(578) |
类型(我的代码) |
收藏此文 |