问题描述:
以十进制形式输出有符号字数组BUF中每个元素的值:负数前面需要输出符号,正数前面不需要符号。各个值之间以空格隔开
问题分析:
这个问题时一个比较基本的流程控制题目,需要掌握的就是基本的程序结构,数据定义,一些流程的控制符号
源代码:
.386
data segment use16
masg0 db 0ah, 0dh, '=====output singned numbers======',0dh,0ah,'$'
masg1 db 'numbers are: $'
nums dw 9
buf dw 9, -9, 0, 254, -254, 255, -255, 32767, -32768
data ends
stack segment use16 stack
db 200 dup(0)
stack ends
code segment use16
assume cs:code, ds:data, ss:stack
start:
; 初始化
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
; 输出提示
lea dx, masg0
mov ah, 9
int 21h
lea dx, masg1
mov ah, 9
int 21h
;以十进制输出有符号字数组的元素
mov cx, nums
shownum: ;一个个数字处理
mov bx, 9
sub bx, cx
mov ax, bx
cwde ;ax扩展到eax
mov ebx, eax
mov ax, buf[2*ebx] ;获得数据
dec cx ;处理的数据减少一个
push cx ;保存余下数据的长度
cmp ax, 0 ;取正
jge positive
neg ax ;取绝对值
;显示符号
mov bx, ax ;保存ax的元素
mov dl, 2dh ;显示负号
mov ah, 2
int 21h
mov ax, bx ;还原ax的元素
positive:
mov cx, 0
countbit: ;一位位处理
mov dx, 0
mov bx, 10
div bx ;除10
push dx ;保存余数
inc cx ;位数目加一
cmp ax, 0
ja countbit ;商不为零跳转
;显示
showbit:
pop dx
dec cx
add dl, 30h
mov ah, 2
int 21h
cmp cx, 0
ja showbit ;大于零,还有位未处理跳转
;显示空格
mov dl, 20h
mov ah, 2
int 21h
pop cx ;数字的数目重新获得
cmp cx, 0
ja shownum ; 大于零,还有数字未处理
;退出
mov ah, 4ch
int 21h
code ends
end start
运行结果: