汇编网首页登录博客注册
zook0k的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2008-06-02 21:26] 第十章实验

实验10 

这次实验勉强可以看懂别人的,自己写不出来,习惯了c的思维,有时间做个汇编的个人笔记总结.

1.显示子程序

assume cs:code,ds:data

data segment
        db 'Welcome to masm!',0
data ends


code segment      

start:

        mov dh,1              ;dh装行号(范围:1--25)
        mov dl,1              ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
        mov cl,0cah           ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
        mov ax,data
        mov ds,ax
        mov si,0

        call show_str        

        mov ax,4c00h
        int 21h 

show_str:   ;显示字符串的子程序[定义开始]
        push cx
        push si

        mov al,0A0h
        dec dh          ;行号在显存中下标从0开始,所以减1
        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2

        add bx,ax      ;此时bx中存放的是行与列号的偏移地址

        mov ax,0B800h
        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址
        mov di,0
        mov al,cl
        mov ch,0

s:      mov cl,ds:[si]
        jcxz ok
        mov es:[bx+di],cl       ;偶地址存放字符
        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性
        inc si
        add di,2
        jmp short s

ok:     pop si
        pop cx        
        ret    ;显示字符串的子程序[定义结束]

 

code ends
end start

 


 

2.解决除法溢出的问题
assume cs:code,ss:stack

stack segment
        dw 8 dup(0)
stack ends

code segment

start:
        mov ax,stack
        mov ss,ax
        mov sp,10h
        mov ax,4240h
        mov dx,0fh
        mov cx,0ah

        call divdw

        mov ax,4c00h
        int 21h

divdw:  ;子程序定义开始

        push ax

        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        ret   ;子程序定义结束


code ends
end start

 

 

3.数值显示
完整程序如下:

assume cs:code,ds:data

data segment
        db 10 dup (0)
data ends

 
code segment
start:

        mov ax,12666
        mov bx,data
        mov ds,bx
        
        mov si,0

        call dtoc

        mov dh,8
        mov dl,3
        mov cl,0cah

        call show_str
 
        mov ax,4c00h
        int 21h

 

dtoc:  ;数值显示的子程序定义

        push dx

        push cx

        push ax

        push si

        push bx

        mov bx,0

s1:     mov cx,10d

        mov dx,0

        div cx        

        mov cx,ax

        jcxz s2

        add dx,30h

        push dx

        inc bx

        jmp short s1

s2:     add dx,30h

        push dx

        inc bx     ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)

        mov cx,bx

        mov si,0

s3:     pop ax

        mov [si],al

        inc si

        loop s3

okay:   pop bx

        pop si

        pop ax

        pop cx

        pop dx

        ret   ;数值显示的子程序定义结束

 

show_str:  
        push bx

        push cx

        push si

        mov al,0A0h

        dec dh

        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2

        add bx,ax

        mov ax,0B800h

        mov es,ax

        mov di,0

        mov al,cl

        mov ch,0

s:      mov cl,ds:[si]

        jcxz ok

        mov es:[bx+di],cl

        mov es:[bx+di+1],al

        inc si

        add di,2

        jmp short s

ok:     pop si
        pop cx
        pop bx

        ret

 

code ends
end start
评论次数(1)  |  浏览次数(653)  |  类型(默认类型) |  收藏此文  | 

[  mess   发表于  2008-06-06 12:15  ]

汇编和c语言有很多想象的地方,都是面向过程的语言,汇编的子程序也c的函数也是一样的,博主多对比,多思考,肯定会有很多的收获的~

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码