汇编语言求详细注释

2024-11-29 00:28:40
推荐回答(2个)
回答1:

data 	segment;定义数据段
org 2000
arr  db 5,2,1,0,2,3,8,6,5,9    
count  equ $-arr 
data  ends

code  segment;定义代码段
     assume cs:code,ds:data 
start:
     ;初始化待排序列
     mov ax,seg data ;取段地址到ax
     mov ds,ax       ;将ax值置入ds
     lea si,arr      ;取数组arr的有效地址即段内偏移置入si
     mov dx,count    ;将数组元素个数置入dx
Foaming:
     ;不足两个元素,已有序
     sub dx,1        ;外循环次数为count-1 
     jle endfoaming  ;dx为1时结束外循环
     xor bx,bx       ;bx赋0
     mov cx,dx       ;内循环次数赋给计数器
Foaminglop:
     ;开始一趟排序
     mov al,[si][bx]  ;依次将数组元素赋给al (注:原程序用ax取8位数会导致错误结果 !)
     cmp al,1[si][bx] ;与下一个元素比较
     jle next ;小于等于则不用交换
     ;逆序则交换
swap:
     mov ah,al ;将前一元素保存到ah   (由于是8位,所以没有用栈操作)
     mov al,1[si][bx] ;将后一元素置入al
     mov [si][bx],al ;将al置入前一元素位置
     mov 1[si][bx],ah ;将ah其置入后一元素位置
next:
     ;继续本趟排序
     inc bx ;前一元素位置下移一格
     loop Foaminglop ;
     ;开始下趟排序
     jmp Foaming ;
endfoaming:
     ;结束排序
     mov ax,4c00h
     int 21h
code  ends
end start;结束程序

================================================================
改错----你的程序还有错误,修改如下
        DATA  SEGMENT               ;定义数据段
              ORG       2000
         ARR  DB        5,2,1,0,2,3,8,6,5,9
       COUNT  EQU       $-ARR
        DATA  ENDS
 
        CODE  SEGMENT               ;定义代码段
              ASSUME    CS:CODE,DS:DATA
      START:
        ;初始化待排序列
              MOV       AX,SEG DATA ;取段地址到ax
              MOV       DS,AX       ;将ax值置入ds
              LEA       SI,ARR      ;取数组arr的有效地址即段内偏移置入si
              MOV       DX,COUNT    ;将数组元素个数置入dx
             
    FOAMING:
        ;不足两个元素,已有序
              SUB       DX,1        ;外循环次数为count-1
              CMP       DX,1
              JLE       ENDFOAMING  ;dx为1时结束外循环
              XOR       BX,BX       ;bx赋0
              MOV       CX,DX       ;内循环次数赋给计数器
 FOAMINGLOP:
        ;开始一趟排序
              MOV       AL,[SI][BX] ;依次将数组元素赋给al (注:原程序用ax取8位数会导致错误结果 !)
              CMP       AL,[SI][BX+1]           ;与下一个元素比较
              JLE       NEXT        ;小于等于则不用交换
        ;逆序则交换
       SWAP:
              MOV       AH,AL       ;将前一元素保存到ah   (由于是8位,所以没有用栈操作)
              MOV       AL,[SI][BX+1]           ;将后一元素置入al
              MOV       [SI][BX],AL ;将al置入前一元素位置
              MOV       [SI][BX+1],AH           ;将ah其置入后一元素位置
       NEXT:
        ;继续本趟排序
              INC       BX          ;前一元素位置下移一格
              LOOP      FOAMINGLOP  ;
        ;开始下趟排序
              JMP       FOAMING     ;
 ENDFOAMING:
        ;结束排序
              LEA       SI,ARR
              MOV       CX,COUNT
       DISP:
              MOV       AL,[SI]
              XOR       AH,AH
              CALL      DISPAX
              INC       SI
              LOOP      DISP
              
              MOV       AX,4C00H
              INT       21H

      DISPAX  PROC      NEAR
      ; 以10进制数形式显示无符号字的值,要显示的值事先存 AX 中
              PUSH      BX
              PUSH      CX          ;保存bx、cx、dx、si
              PUSH      DX
              PUSH      SI
              PUSH      DS
              PUSH      CS
              POP       DS
              JMP       NUMDEF
      DIVARR  DW        10000,1000,100,10,1
          NZ  DB        0
     NUMDEF:
              MOV       BYTE PTR NZ,0           ; 状态,看是否已输出过非 0
              PUSH      AX
              LEA       SI,DIVARR
              MOV       CX,5
      DISP1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       DISP2       ; 当 al不为0时输出
              CMP       BYTE PTR NZ,1           ; 当al 为0时,再比较nz 是否为 1
              JE        DISP2       ; 等于1 表示前面已输出过非 0 应将 0 输出
              CMP       CX,1        ; 当最后一位仍 为0 时 输出 0 而非空格
              JE        DISP2
              MOV       DL,20H
              JMP       DISP3
      DISP2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZ,1
      DISP3:
              MOV       AH,2
              INT       21H
              INC       SI
              INC       SI
              LOOP      DISP1
              POP       DX
              POP       DS
              POP       SI          ; 恢复bx、cx、dx、si
              POP       DX
              POP       CX
              POP       BX
              RET
      DISPAX  ENDP
              
        CODE  ENDS
              END       START       ;结束程序

回答2:

已经有注释了,还注毛呢,不会连mov、push、inc都不知道吧。。。补充一下:
org 2000 ; 当前地址往后偏移2000字节
arr db 5,2,1,0,2,3,8,6,5,9
count equ $-arr ; 当前地址-arr变量的地址,这里表示arr的字节数。count只是一个常熟,不占内存地址