. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我写的实验10的子程序,大家看看,找找不足  [待解决] 回复[ 6次 ]   点击[ 321次 ]  
a3187744a
[帖 主]   [ 发表时间:2009-12-23 23:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-14 19:20
第一个是显示子程序
show_str:push dx
  push es
  push ax
  push si
  push di
  push cx
  mov al,dh
  mov dh,160
  mul dh
  mov dh,0
  add dx,dx
  add ax,dx
  mov di,ax
  mov ax,0b800h        
  mov es,ax
  mov al,cl
s:mov cl,[si]
  mov ch,0
  jcxz ok
  mov byte ptr es:[di],cl
  mov byte ptr es:[di+1],al
  inc si
  add di,2
  jmp short s
ok:pop cx
  pop di
  pop si
  pop ax
  pop dx
  pop es
  ret
第二个是解决除法益处的
divdw:push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
第三个是数值显示的问题
assume cs:code

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,2
      call show_str
      
      mov ax,4c00h
      int 21h
dtoc:push cx
     push dx
     push si
     
     mov dx,0
     dtoc_s:mov cx,10
     call divdw
     jcxz dtoc_ok
     add cx,30H
     push cx
     inc si
     jmp short dtoc_s
     dtoc_ok:mov cx,si
             mov si,0
             dtoc_s1:pop [si]
             inc si
             loop dtoc_s1
             pop si
             pop dx
             pop cx
             ret

divdw:push bx
      mov bx,ax
      mov ax,dx
      mov dx,0
      div cx
      push ax
      mov ax,bx
      div cx
      mov cx,dx
      pop dx
      pop bx
      ret

show_str:push dx
         push es
         push ax
         push si
         push di
         push cx
         mov al,dh
         mov dh,160
         mul dh
         mov dh,0
         add dx,dx
         add ax,dx
         mov di,ax
         mov ax,0b800h        
         mov es,ax
         mov al,cl
         show_str_s:mov cl,[si]
         mov ch,0
         jcxz show_str_ok
         mov es:[di],cl
         mov es:[di+1],al
         inc si
         add di,2
         jmp short show_str_s
      show_str_ok:pop cx
         pop di
         pop si
         pop ax
         pop dx
         pop es
         ret 
code ends
end start



大家找找我的不足
abob
[第1楼]   [ 回复时间:2009-12-25 14:39 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
看代码还是蛮精炼的。不错 ^_^

 mov byte ptr es:[di],cl 
  mov byte ptr es:[di+1],al 
------------
这个是第一个子程序的,可以把颜色和数值放到一个16位寄存器中,这样就不用byte ptr标明了。
jack_yin
[第2楼]   [ 回复时间:2010-01-05 22:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-05 21:48
mov byte ptr es:[di],cl  
  mov byte ptr es:[di+1],al  
这个 本身就可以 不用 byte ptr 的 因为 cl,al 已经指明是8位操作了
lengyuyiming
[第3楼]   [ 回复时间:2010-01-12 22:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-11 14:49
我也发一个,请大家拍砖。谢谢!
data segment
        string db 'Hello,Assembly World!',0
data ends

stack segment
        dw 32 dup(?)
stack ends

assume cs:code,ss:stack,ds:data

code segment
        start:        mov         ax,data
                        mov         ds,ax                        ;设置段地址
                        mov         ax,stack
                        mov         ss,ax                        ;设置栈地址
                        
                        mov                ax,0B800h
                        mov                es,ax                        ;设置附加段地址,显示缓冲区地址
                        mov                si,offset string;设置源字符串首地址
                        ;mov                di,1FFh                ;设置目的地址
                        mov                dh,12                        ;设置行        
                        mov                dl,30                        ;设置列
        
                        call        ShowStr                        ;调用显示以\0结束的字符串函数
                        jmp                exit
                        
        exit:        mov         ax,4c00h                ;程序结束
                        int         21h

;显示字符子模块------------------------------------------------------
;源地址寄存器si,行地址ah,列地址al-----------------------------------
        ShowStr:
                        push        cx                                ;保存环境
                        push    di
                        push        ax
                        
                        mov                di,dx                        ;将列地址传入di
                        and                di,00FFh                ;取低位列地址
                        mov                al,80
                        mul                dh
                        add                di,ax
                        add                di,di
  ShowStrBG:mov                ch,0
                        mov                cl,ds:[si]
                        jcxz        ShowStrOK                ;判断是否为结束符\0
                        mov                es:[di],cl
                        inc                di
                        mov                es:[di],0ACh
                        inc                si
                        inc                di
                        jmp                ShowStrBG
                        
  ShowStrOK:pop                ax
                          pop                di
                          pop                cx                                ;恢复环境
                          ret        
code ends
        end start
lengyuyiming
[第4楼]   [ 回复时间:2010-01-12 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-11 14:49
我也发一个,请大家拍砖。谢谢!(重新发一个对齐版)
data segment
        string db 'Hello,Assembly World!',0
data ends

stack segment
        dw 32 dup(?)
stack ends

assume cs:code,ss:stack,ds:data

code segment
        start:        mov         ax,data
                mov         ds,ax                ;设置段地址
                mov         ax,stack
                mov         ss,ax                ;设置栈地址                        
                mov        ax,0B800h
                mov        es,ax                ;设置附加段地址,显示缓冲区地址
                mov        si,offset string;设置源字符串首地址
                mov        dh,12                ;设置行        
                mov        dl,30                ;设置列
                call        ShowStr                ;调用显示以\0结束的字符串函数
                jmp        exit                        
        exit:        mov         ax,4c00h        ;程序结束
                 int         21h

;显示字符子模块------------------------------------------------------
;源地址寄存器si,行地址ah,列地址al-----------------------------------
        ShowStr:
                push        cx                ;保存环境
                push    di
                push        ax        
                mov        di,dx                ;将列地址传入di
                and        di,00FFh        ;取低位列地址
                mov        al,80
                mul        dh
                add        di,ax
                add        di,di
  ShowStrBG:    mov        ch,0
                mov        cl,ds:[si]
                jcxz        ShowStrOK        ;判断是否为结束符\0
                mov        es:[di],cl
                inc        di
                mov        es:[di],0ACh
                inc        si
                inc        di
                jmp        ShowStrBG                        
  ShowStrOK:    pop        ax
                  pop        di
                  pop        cx                ;恢复环境
                  ret        
code ends
        end start
ldlihuanfa
[第5楼]   [ 回复时间:2010-01-19 17:43 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
原来楼主把第三个的除法运算又调用到第二个了
ldlihuanfa
[第6楼]   [ 回复时间:2010-01-20 14:50 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
关于这里有一点不解
 mov dx,0 
     dtoc_s:mov cx,10 
     call divdw 
     jcxz dtoc_ok        调用第二个子程序真是很好啊,这样可以避免溢出,只是当调用时,余数是保存cx中的,当商为0时,可jcxz判断的是cx啊,就变成判断余数是否为0了,不太对啊     add cx,30H 
     push cx 
     inc si 
     jmp short dtoc_s
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved