当前位置: 代码迷 >> 汇编语言 >> 汇编小疑点,大大们帮帮忙
  详细解决方案

汇编小疑点,大大们帮帮忙

热度:3088   发布时间:2013-02-26 00:00:00.0
汇编小问题,大大们帮帮忙!
DATAS SEGMENT
  suggestion db 'please input a year:$'
  leap db 'This is a leap year$'
  noleap db 'This is not a leap year$'
  sum dw ?
  buf db 8
  db ?
  db 100 dup(?)
DATAS ENDS

STACKS SEGMENT
db 100 dup(?)
   
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
  MOV DS,AX
  LEA DX,suggestion
  MOV AH,09H
  INT 21H
  LEA DX,buf
  MOV AH,0AH
  INT 21H
   
  MOV CL,[BUF+1]
  CALL datacata
  CALL ifyear
  JC A1
  LEA DX,noleap
  MOV AX,9
  INT 21H
  JMP EXIT
  A1: LEA DX,leap
  MOV AX,9
  INT 21H
  EXIT: MOV AH,4CH
  INT 21H
  
  datacata proc near
   
  PUSH CX
  DEC CX  
  MOV BL,10
  LEA SI,BUF+2
  FF: INC SI
  LOOP FF
  POP CX
  MOV DL,30H
  MOV AX,1
  FF1: PUSH AX  
  SUB BYTE PTR [SI],DL
  MUL BYTE PTR [SI]
  ADD sum,AX
  POP AX
  MUL BL
  DEC SI
  LOOP FF1
  RET
datacata ENDP

ifyear proc near
PUSH DX
PUSH BX
PUSH CX
MOV AX,sum
MOV CX,AX
MOV DX,00H
MOV BX,100
DIV BX
CMP DX,0
JNZ L1
MOV AX,CX
MOV BX,400
DIV BX
CMP DX,0
JZ L2
JMP L3

L1: MOV AX,CX
MOV BX,4
DIV BX
CMP DX,0
JZ L2
JMP L3
L2: STC
JMP L4
L3: CLC
L4: POP AX
POP BX
POP CX
RET
ifyear endp
   
  MOV AH,4CH
  INT 21H
CODES ENDS
  END START
这是一个闰年的程序, 编译无错误 执行的时候,变成这样




------解决方案--------------------------------------------------------
Assembly code
; 主要问题就如下所示。另外最后的显示内容最好前导有回车换行以版面更清楚些。LEA DX,bufMOV AH,0AHINT 21Hmov ch, 0        ;*+ ch 不置 0 进 datacata 可能会出错MOV CL,[BUF+1]CALL datacataCALL ifyearJC A1LEA DX,noleapMOV AH,9        ;* AX -> AHINT 21HJMP EXITA1: LEA DX,leapMOV AH,9        ;* AX -> AHINT 21HEXIT: MOV AH,4CHINT 21Hdatacata proc nearPUSH CXDEC CX MOV BL,10LEA SI,BUF+2FF: INC SILOOP FFPOP CXMOV DL,30HMOV AX,1FF1: PUSH AX ; SUB BYTE PTR [SI],DL    ;*- MUL byte ptr 是 AL *[SI]; MUL BYTE PTR [SI]    ;*-   在有千位年时就会出错mov dl, byte ptr [si]    ;*+   因为 1000=03E8,有 03h 在sub dl, '0'        ;*+   AH 中没有进行乘运算mov dh, 0        ;*+mul dx            ;*+ADD sum,AXPOP AXMUL BLDEC SILOOP FF1RETdatacata ENDPifyear proc nearPUSH DXPUSH BXPUSH CXMOV AX,sumMOV CX,AXMOV DX,00HMOV BX,100DIV BXCMP DX,0JNZ L1MOV AX,CXMOV BX,400DIV BXCMP DX,0JZ L2JMP L3L1: MOV AX,CXmov dx, 0    ;*+ 由于上面的 DIV 100 会在 DX 留值,故须置0MOV BX,4
  相关解决方案