问题描述:

 以十进制形式输出有符号字数组BUF中每个元素的值:负数前面需要输出符号,正数前面不需要符号。各个值之间以空格隔开

问题分析:

这个问题时一个比较基本的流程控制题目,需要掌握的就是基本的程序结构,数据定义,一些流程的控制符号

源代码:

 

 .386
 data segment use16
  masg0 db 0ah, 0dh, 
'=====output singned numbers======',0dh,0ah,'$'
  masg1 db 
'numbers are:  $'
  nums dw 
9
  buf dw 
9, -90254, -254255, -25532767, -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

运行结果:

 

posted on 2011-05-26 14:58  hustlijian  阅读(277)  评论(0编辑  收藏  举报

无觅相关文章插件,快速提升流量