问题介绍:
以十进制形式输出有符号字数组BUF中每个元素的值:负数前面需要输出符号,正数前面不需要符号。各个值之间以空格隔开
问题分析:
一个基本的汇编语言入门的例子,需要掌握基本的程序结构,数据定义,还有一些流程控制语句就可以完成了
源代码:
1 .386
2 data segment use16
3 masg0 db 0ah, 0dh, '=====output singned numbers======',0dh,0ah,'$'
4 masg1 db 'numbers are: $'
5 nums dw 9
6 buf dw 9, -9, 0, 254, -254, 255, -255, 32767, -32768
7 count equ ($ - buf)/2
8 data ends
9
10 stack segment use16 stack
11 db 200 dup(0)
12 stack ends
13
14 code segment use16
15 assume cs:code, ds:data, ss:stack
16 start:
17 ; 初始化
18 mov ax, data
19 mov ds, ax
20 mov ax, stack
21 mov ss, ax
22
23 ; 输出提示
24 lea dx, masg0
25 mov ah, 9
26 int 21h
27
28 lea dx, masg1
29 mov ah, 9
30 int 21h
31
32 ;以十进制输出有符号字数组的元素
33 mov cx, nums
34
35 shownum: ;一个个数字处理
36 mov bx, 9
37 sub bx, cx
38 mov ax, bx
39 cwde ;ax扩展到eax
40 mov ebx, eax
41 mov ax, buf[2*ebx] ;获得数据
42 dec cx ;处理的数据减少一个
43 push cx ;保存余下数据的长度
44 cmp ax, 0 ;取正
45 jge positive
46 neg ax ;取绝对值
47 ;显示符号
48 mov bx, ax ;保存ax的元素
49 mov dl, 2dh ;显示负号
50 mov ah, 2
51 int 21h
52 mov ax, bx ;还原ax的元素
53 positive:
54 mov cx, 0
55 countbit: ;一位位处理
56 mov dx, 0
57 mov bx, 10
58 div bx ;除10
59 push dx ;保存余数
60 inc cx ;位数目加一
61 cmp ax, 0
62 ja countbit ;商不为零跳转
63 ;显示
64 showbit:
65 pop dx
66 dec cx
67 add dl, 30h
68 mov ah, 2
69 int 21h
70 cmp cx, 0
71 ja showbit ;大于零,还有位未处理跳转
72 ;显示空格
73 mov dl, 20h
74 mov ah, 2
75 int 21h
76
77 pop cx ;数字的数目重新获得
78 cmp cx, 0
79 ja shownum ; 大于零,还有数字未处理
80 ;退出
81 mov ah, 4ch
82 int 21h
83 code ends
84 end start
2 data segment use16
3 masg0 db 0ah, 0dh, '=====output singned numbers======',0dh,0ah,'$'
4 masg1 db 'numbers are: $'
5 nums dw 9
6 buf dw 9, -9, 0, 254, -254, 255, -255, 32767, -32768
7 count equ ($ - buf)/2
8 data ends
9
10 stack segment use16 stack
11 db 200 dup(0)
12 stack ends
13
14 code segment use16
15 assume cs:code, ds:data, ss:stack
16 start:
17 ; 初始化
18 mov ax, data
19 mov ds, ax
20 mov ax, stack
21 mov ss, ax
22
23 ; 输出提示
24 lea dx, masg0
25 mov ah, 9
26 int 21h
27
28 lea dx, masg1
29 mov ah, 9
30 int 21h
31
32 ;以十进制输出有符号字数组的元素
33 mov cx, nums
34
35 shownum: ;一个个数字处理
36 mov bx, 9
37 sub bx, cx
38 mov ax, bx
39 cwde ;ax扩展到eax
40 mov ebx, eax
41 mov ax, buf[2*ebx] ;获得数据
42 dec cx ;处理的数据减少一个
43 push cx ;保存余下数据的长度
44 cmp ax, 0 ;取正
45 jge positive
46 neg ax ;取绝对值
47 ;显示符号
48 mov bx, ax ;保存ax的元素
49 mov dl, 2dh ;显示负号
50 mov ah, 2
51 int 21h
52 mov ax, bx ;还原ax的元素
53 positive:
54 mov cx, 0
55 countbit: ;一位位处理
56 mov dx, 0
57 mov bx, 10
58 div bx ;除10
59 push dx ;保存余数
60 inc cx ;位数目加一
61 cmp ax, 0
62 ja countbit ;商不为零跳转
63 ;显示
64 showbit:
65 pop dx
66 dec cx
67 add dl, 30h
68 mov ah, 2
69 int 21h
70 cmp cx, 0
71 ja showbit ;大于零,还有位未处理跳转
72 ;显示空格
73 mov dl, 20h
74 mov ah, 2
75 int 21h
76
77 pop cx ;数字的数目重新获得
78 cmp cx, 0
79 ja shownum ; 大于零,还有数字未处理
80 ;退出
81 mov ah, 4ch
82 int 21h
83 code ends
84 end start