王爽 汇编 实验10

1. 显示字符串

  第一次写出来的代码发现只能用作特定问题,如果其他程序调用子程序将会出错.后面的题目也就无法完成.所以重新写了一遍,进入后子程序中使用的寄存器全部入栈

 1 assume cs:code
 2 
 3 data segment
 4     db 'Welcometomasm!',0
 5 data ends
 6 
 7 stack segment
 8     db 16 dup (0)
 9 stack ends
10 
11 code segment
12     start:
13         mov dh,8
14         mov dl,3    ;第八行第三列
15         
16         mov cl,2    ;颜色
17             
18         mov ax,data
19         mov ds,ax    ;ds指向数据段
20         
21         mov si,0
22         call show_str
23 
24     all:
25         jmp short all    ;一直循环
26         
27         mov ax,4c00h
28         int 21h
29     
30     show_str:
31         push dx
32         push ax
33         push cx        ;子程序开始前入栈
34         push si
35         
36         mov ax,0b800h
37         mov es,ax    ;es指向现存的起始地址
38         
39         mov al,160    ;一行可现实80个字符,每个字符2字节.160字节
40         dec dh        ;行-1
41         mul dh        ;乘,结果在ax中
42         mov bx,ax    
43         ;(n行-1)*160=n行开头的偏移地址
44         
45         mov al,2    ;一个字符占2列
46         dec dl        ;列-1
47         mul dl        
48         mov di,ax    ;列的偏移地址
49         ;(n列-1)*2=当前列的偏移地址
50         
51         ;颜色设置
52         mov ch,0
53         mov dx,cx
54     s:
55         mov cl,[si]    ;ds:[si]指向字符串的首地址
56         mov ch,0
57         jcxz ok
58         mov ax,[si]
59         mov es:[bx+di],ax
60         mov es:[bx+di+1],dx
61         ;一个字母占两个字节,一个ascii
62         add di,2
63         inc si
64         jmp short s
65         
66     ok:    
67         pop si
68         pop cx
69         pop ax
70         pop dx
71         ret
72         
73 code ends
74 end start

 

  图片显示:

 3. 数值显示

  

  1 assume cs:code
  2 data segment
  3     dw 16 dup (0)
  4 data ends
  5 
  6 code segment
  7 start:
  8     mov bx,data    ;指向数据段
  9     mov ds,bx
 10 
 11     mov si,0
 12     mov ax,12345
 13     call dtoc
 14     
 15     mov dh,3
 16     mov dl,3
 17     mov cl,2
 18     call show_str
 19 
 20     ;一直循环
 21 all:
 22     jmp short all
 23     
 24     mov ax,4c00h
 25     int 21h
 26     
 27 dtoc:
 28     push ax
 29     push cx
 30     push bx
 31     push si
 32     push di        ;备份
 33     
 34     mov bx,10
 35     mov di,0    ;记录循环的次数
 36 
 37     ;循环s用来
 38     sd:    
 39         mov dx,0
 40         div bx
 41         add dx,30h
 42     
 43         push dx    ;用栈存储然后出栈调整顺序
 44         inc di    
 45         mov cx,ax    ;ax为商,商为0结束
 46     
 47         jcxz okd
 48     
 49     jmp short sd
 50     okd:
 51     
 52         mov cx,di
 53     sd1:
 54         pop ax
 55         mov [si],al    ;将值传入 ds:[si]
 56         inc si    
 57     loop sd1
 58     
 59         pop di
 60         pop si
 61         pop bx
 62         pop cx
 63         pop ax
 64         ret
 65     
 66     ; 字符展示子程序
 67     show_str:
 68         push ax
 69         push bx
 70         push cx        ;子程序开始前入栈
 71         push di
 72         push si
 73         
 74         mov ax,0b800h
 75         mov es,ax    ;es指向显存的起始地址
 76         
 77         mov al,160    ;一行可现实80个字符,每个字符2字节.160字节
 78         dec dh        ;行-1
 79         mul dh        ;乘,结果在ax中
 80         mov bx,ax    
 81         ;(n行-1)*160=n行开头的偏移地址
 82         
 83         mov al,2    ;一个字符占2列
 84         dec dl        ;列-1
 85         mul dl        
 86         mov di,ax    ;列的偏移地址
 87         ;(n列-1)*2=当前列的偏移地址
 88         
 89         ;颜色设置
 90         mov ch,0
 91         mov dx,cx
 92     s_show:
 93         mov cl,[si]    ;ds:[si]指向字符串的首地址
 94         mov ch,0
 95         
 96         jcxz ok_show
 97         
 98         mov ax,[si]
 99         mov es:[bx+di],ax
100         mov es:[bx+di+1],dx    ;颜色设置
101         ;一个字母占两个字节,一个ascii
102         add di,2
103         inc si
104         jmp short s_show
105         
106     ok_show:    
107         pop si
108         pop di
109         pop cx
110         pop bx
111         pop ax    ;出栈
112         ret
113     
114 code ends
115 end start
posted @ 2018-03-11 19:42  Tri0mphe  阅读(331)  评论(0编辑  收藏  举报