Fork me on Gitee

汇编三(习题)

 1:内存分布图

  注意:  必须弄懂这个图,这能良好处理指令序列

 常用归零代码:

1:MOV AX,0
2:SUB AX,AX
3:XOR AX,AX
4:AND AX,00H

 

 

1假设寄存器AX保存的是一个有符号数,编写一个程序实现加下功:

 

DATAS SEGMENT
    X DW  02H;
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    XOR AX,AX
    MOV AX,X
    CMP AX,0
    JGE next
    MOV AX,-1
    JMP next2
    next:
    MOV AX,1
    next2:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

2: 编制一完整的程序,统计有符号字数组ARRARW中大于5,小于5和等于5的数据个数,并将其分别存储到字变量MAX5,MIN5和EQU5中去

注意: INC DEC 指令不能直接操作 数据段中的操作数

正确的程序:

 

 

DATAS SEGMENT
    ARRARW DW '1','2','5','6','8'
    MAX5 DW ?;
    MIN5 DW ?;
    EQU5 DW ?;
    len DW $-ARRARW;
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
      XOR AX,AX ;存储MIN5
      XOR BX,BX ;存储MAX5
      XOR DX,DX ;存储EQU5
      MOV CX,5;
      MOV SI,0
      next:
        CMP ARRARW[SI],'5'
        JGE large5
        INC AX   ; 小于5
        JMP next2
        large5:
        CMP ARRARW[SI],'5'
        JE equ5s
        INC DX    ;大于5
        JMP next2
        equ5s:
        INC BX    ;等于5
      next2:
      INC SI
      CMP SI,len
      JGE next3
      LOOP next
      next3:
      ADD AX,30H ; DW进行对齐
      ADD BX,30H ;
      ADD DX,30H ;
      MOV MIN5,AX;1
      MOV MAX5,DX;2
      MOV EQU5,BX;2
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

 

 

 

原来错误的程序:

为什么显示不出来 因为DW中的是自变量需要手动加30H, 改正后正常显示正常

 

 

 

 

 

DATAS SEGMENT
    ARRARW DW '1','2','5','6','8'
    MAX5 DW ?;
    MIN5 DW ?;
    EQU5 DW ?;
    len DW $-ARRARW;
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
      XOR AX,AX ;存储MIN5
      XOR BX,BX ;存储MAX5
      XOR DX,DX ;存储EQU5
      MOV CX,5;
      MOV SI,0
      next:
        CMP ARRARW[SI],'5'
        JGE large5
        INC AX   ; 小于5
        JMP next2
        large5:
        CMP ARRARW[SI],'5'
        JE equ5s
        INC DX    ;大于5
        JMP next2
        equ5s:
        INC BX    ;等于5
      next2:
      INC SI
      CMP SI,len
      JGE next3
      LOOP next
      next3:
      MOV WORD PTR MIN5,AX;这里看不到值 有疑问
      MOV WORD PTR MAX5,DX
      MOV WORD PTR EQU5,BX
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

 

3: 编制求BX寄存器中的信息含有多少个二进制位"1"的程序

正确程序:

DATAS SEGMENT
    X DB '123411'
    len EQU $-X
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,0H 
    MOV BX,0H
    MOV CX,6;
    next:
    CMP X[BX],31H 
    JNE next2
     INC AX ; 表示1的个数
     JMP next2
    next2:
     INC BX
    loop next
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

 

 

 

 

 错误程序如下(自己写的有不想删除,当做教训):

DATAS SEGMENT
    X DB 1,2,3,4,1,1
    len EQU $-X
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
      XOR AX,AX
      XOR BX,BX
      LEA BX,X
      MOV CX,len
      next:SHL BL,1
      JNC next2
       INC AL
       next2: 
      loop next
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

 

posted @ 2019-11-08 17:38  ---dgw博客  阅读(343)  评论(0编辑  收藏  举报