| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1014 人关注过本帖
标题:急救!急救!急救!!!
只看楼主 加入收藏
jhtyolg20002
Rank: 1
等 级:新手上路
帖 子:66
专家分:6
注 册:2007-3-29
收藏
 问题点数:0 回复次数:4 
急救!急救!急救!!!
(用汇编)编写一个程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayB和负数数组arrayC并分别把这两个数组中的数据显示出来.(是显示数据,不是个数)
下面的代码好象有点乱,请各位大哥大姐费心了
谢谢!






 DATA  SEGMENT
          MA  DW        2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3       ;定义源数组各个元素
   
          MB  DW        20   DUP(?) ;定义正数的存储单元
          MC  DW        20   DUP(?) ;定义负数的存储单元
        PLUS  DW        ?           ;记录正数个数
      NEGATV  DW        ?           ;记录负数个数
       COUNT  =         ($-MB)/2
       WTEMP  DW        ?
        DATA  ENDS
        STAK  SEGMENT   PARA   STACK   'STACK'
         SPP  DB        100   DUP(?)            ;定义堆栈空间
         TOP  DB        ?
        STAK  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA,SS:STAK
      START:  MOV       AX,DATA
              MOV       DS,AX       ;设置数据段寄存器
              MOV       AX,STAK     ;设置堆栈段寄存器
              MOV       SS,AX
              LEA       SP,TOP      ;设置堆栈指针
              LEA       SI,MA
              LEA       DI,MB
              LEA       BX,MC
              MOV       CX,20       ;设置循环次数
       LOP1:  MOV       AX,0
              MOV       AL,[SI]
              CMP       AL,0
              JNL       LOP2        ;元素为正数则跳出
              MOV       [BX],AL     ;否则为负数则存入负数数组
              INC       NEGATV      ;负数计数
              INC       BX          ;修改数组地址
              JMP       AGAIN0
       LOP2:  MOV       [DI],AL     ;将正数存入正数数组
              INC       PLUS        ;正数计数
              INC       DI          ;修改数组地址
     AGAIN0:  INC       SI          ;修改原数组地址
              LOOP      LOP1
              ;MOV       AH,4CH      ;返回DOS系统
              ;INT       21H

              MOV       CX,COUNT
              MOV       BX,OFFSET MB
     AGAIN1:  MOV       AX,[BX]
              MOV       WTEMP,AX
              CALL      WRITE
              INC       BX
              INC       BX
              CALL      DPCRLF
              LOOP      AGAIN1
.EXIT         0
;

       WRITE  PROC
              PUSH      AX
              PUSH      BX
              PUSH      DX
              MOV       AX,WTEMP
              TEST      AX,AX
              JNZ       WRITE1
              MOV       DL,'0'
              MOV       AH,2
              INT       21H
              JMP       WRITE5
     WRITE1:  JNS       WRITE2
              MOV       BX,AX
              MOV       DL,'-'
              MOV       AH,2
              INT       21H
              MOV       AX,BX
              NEG       AX
     WRITE2:  MOV       BX,10
              PUSH      BX
     WRITE3:  CMP       AX,0
              JZ        WRITE4
              SUB       DX,DX
              DIV       BX
              ADD       DL,30H
              PUSH      DX
              JMP       WRITE3
     WRITE4:  POP       DX
              CMP       DL,10
              JE        WRITE5
              MOV       AH,2
              INT       21H
              JMP       WRITE4
     WRITE5:  POP       DX
              POP       BX
              POP       AX
              RET
       WRITE  ENDP
      DPCRLF  PROC
              PUSH      AX
              PUSH      DX
              MOV       AH,2
              MOV       DL,0DH
              INT       21H
              MOV       AH,2
              MOV       DL,0AH
              INT       21H
              POP       DX
              POP       AX
              RET
      DPCRLF  ENDP
        CODE  ENDS
              END       START
搜索更多相关主题的帖子: 急救 
2007-12-07 11:17
wolaixiazai
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-4-11
收藏
得分:0 
问题已经解决,代码已经按我自己的意思改了不少,楼主自己看吧
DATA  SEGMENT
          MA  DB        2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3   
                           ;定义20个元素的数组
          MB  DB        20   DUP(?) ;定义正数的存储单元
          MC  DB        20   DUP(?) ;定义负数的存储单元
        PLUS  DB        ?           ;记录正数个数
      NEGATV  DB        ?           ;记录负数个数
DATA  ENDS
CODE  SEGMENT
       ASSUME  CS:CODE,DS:DATA
MAIN    PROC   FAR
START:        MOV       AX,DATA
              MOV       DS,AX       ;设置数据段寄存器
       LEA       SI,MA
              LEA       DI,MB
              LEA       BX,MC
              MOV       CX,20    ;设置循环次数
       LOP1:  MOV       AX,0
              MOV       AL,[SI]
              TEST      AL,80H      
              JZ        LOP2        ;元素为正数则跳出
              MOV       [BX],AL     ;否则为负数则存入负数数组
              INC       NEGATV      ;负数计数
              INC       BX          ;修改数组地址
              JMP       AGAIN0
        LOP2: MOV       [DI],AL     ;将正数存入正数数组
              INC       PLUS        ;正数计数
              INC       DI          ;修改数组地址
      AGAIN0: INC       SI          ;修改原数组地址
              LOOP      LOP1
               
              MOV       CL,PLUS
              CMP       CL,0
              JE        LP1         
              MOV       BX,OFFSET MB ;输出正数组
      AGAIN1: MOV       DL,10
              MOV       AL,[BX]
              MOV       AH,0
              DIV       DL
              CMP       AL,0
              JE        TO1          ;商为0则跳到TO1
              MOV       DH,AH
              ADD       AL,30H
              MOV       DL,AL
             MOV       AH,2
              INT       21H
              ADD       DH,30H
              MOV       DL,DH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
              JMP       TO2
         TO1: ADD       AH,30H
              MOV       DL,AH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
         TO2: INC       BX
              DEC       CL
              JNE       AGAIN1
              CALL      ENTER         ;回车换行
       LP1: MOV       CL,NEGATV     ;输出负数组
       CMP       CL,0
              JE        LP2
              MOV       BX,OFFSET MC
      AGAIN2: MOV       DL,'-'
              MOV       AH,2
              INT       21H
              MOV       DL,10
              MOV       AL,[BX]
              MOV       AH,0FFH
              NOT       AX            ;负数转换为绝对值(的原码)就是"按位取反然后加一"
              ADD       AX,1
              DIV       DL
              CMP       AL,0
              JE        TO3           ;商为0则跳到TO3
              MOV       DH,AH
              ADD       AL,30H
              MOV       DL,AL
              MOV       AH,2
              INT       21H
              ADD       DH,30H
              MOV       DL,DH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
              JMP       TO4
         TO3: ADD       AH,30H        
              MOV       DL,AH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
         TO4: INC       BX
              DEC       CL
              JNE       AGAIN2
         LP2: MOV       AH,4CH
              INT       21H
        ENTER  PROC   NEAR
              MOV       DL,13
              MOV       AH,2
              INT       21H
              MOV       DL,10
              MOV       AH,2
              INT       21H
              RET
        ENTER ENDP  
MAIN ENDP
CODE  ENDS
          END    START
2007-12-08 13:54
wolaixiazai
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-4-11
收藏
得分:0 
问题已经解决,代码已经按我自己的意思改了不少,楼主自己看吧
DATA  SEGMENT
          MA  DB        2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3   
                           ;定义20个元素的数组
          MB  DB        20   DUP(?) ;定义正数的存储单元
          MC  DB        20   DUP(?) ;定义负数的存储单元
        PLUS  DB        ?           ;记录正数个数
      NEGATV  DB        ?           ;记录负数个数
DATA  ENDS
CODE  SEGMENT
       ASSUME  CS:CODE,DS:DATA
MAIN    PROC   FAR
START:        MOV       AX,DATA
              MOV       DS,AX       ;设置数据段寄存器
       LEA       SI,MA
              LEA       DI,MB
              LEA       BX,MC
              MOV       CX,20    ;设置循环次数
       LOP1:  MOV       AX,0
              MOV       AL,[SI]
              TEST      AL,80H      
              JZ        LOP2        ;元素为正数则跳出
              MOV       [BX],AL     ;否则为负数则存入负数数组
              INC       NEGATV      ;负数计数
              INC       BX          ;修改数组地址
              JMP       AGAIN0
        LOP2: MOV       [DI],AL     ;将正数存入正数数组
              INC       PLUS        ;正数计数
              INC       DI          ;修改数组地址
      AGAIN0: INC       SI          ;修改原数组地址
              LOOP      LOP1
               
              MOV       CL,PLUS
              CMP       CL,0
              JE        LP1         
              MOV       BX,OFFSET MB ;输出正数组
      AGAIN1: MOV       DL,10
              MOV       AL,[BX]
              MOV       AH,0
              DIV       DL
              CMP       AL,0
              JE        TO1          ;商为0则跳到TO1
              MOV       DH,AH
              ADD       AL,30H
              MOV       DL,AL
             MOV       AH,2
              INT       21H
              ADD       DH,30H
              MOV       DL,DH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
              JMP       TO2
         TO1: ADD       AH,30H
              MOV       DL,AH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
         TO2: INC       BX
              DEC       CL
              JNE       AGAIN1
              CALL      ENTER         ;回车换行
       LP1: MOV       CL,NEGATV     ;输出负数组
       CMP       CL,0
              JE        LP2
              MOV       BX,OFFSET MC
      AGAIN2: MOV       DL,'-'
              MOV       AH,2
              INT       21H
              MOV       DL,10
              MOV       AL,[BX]
              MOV       AH,0FFH
              NOT       AX            ;负数转换为绝对值(的原码)就是"按位取反然后加一"
              ADD       AX,1
              DIV       DL
              CMP       AL,0
              JE        TO3           ;商为0则跳到TO3
              MOV       DH,AH
              ADD       AL,30H
              MOV       DL,AL
              MOV       AH,2
              INT       21H
              ADD       DH,30H
              MOV       DL,DH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
              JMP       TO4
         TO3: ADD       AH,30H        
              MOV       DL,AH
              MOV       AH,2
              INT       21H
              MOV       DL,','
              MOV       AH,2
              INT       21H
         TO4: INC       BX
              DEC       CL
              JNE       AGAIN2
         LP2: MOV       AH,4CH
              INT       21H
        ENTER  PROC   NEAR
              MOV       DL,13
              MOV       AH,2
              INT       21H
              MOV       DL,10
              MOV       AH,2
              INT       21H
              RET
        ENTER ENDP  
MAIN ENDP
CODE  ENDS
          END    START
2007-12-08 13:56
jhtyolg20002
Rank: 1
等 级:新手上路
帖 子:66
专家分:6
注 册:2007-3-29
收藏
得分:0 
我还没有看 但先谢谢 楼上的仁兄 了
2007-12-08 16:41
jhtyolg20002
Rank: 1
等 级:新手上路
帖 子:66
专家分:6
注 册:2007-3-29
收藏
得分:0 
I 老虎 YOU!
再次谢谢楼上的仁兄了!已经运行通过!
非常感谢,祝你幸福一生!
2007-12-08 16:50
快速回复:急救!急救!急救!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013539 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved