专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

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

发布时间:2010-06-14 15:45:39 文章来源:www.iduyao.cn 采编人员:星星草
汇编小问题,大大们帮帮忙!
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,buf
MOV AH,0AH
INT 21H

mov ch, 0        ;*+ ch 不置 0 进 datacata 可能会出错
MOV CL,[BUF+1]
CALL datacata
CALL ifyear
JC A1
LEA DX,noleap
MOV AH,9        ;* AX -> AH
INT 21H
JMP EXIT
A1: LEA DX,leap
MOV AH,9        ;* AX -> AH
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 是 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,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 dx, 0    ;*+ 由于上面的 DIV 100 会在 DX 留值,故须置0
MOV BX,4
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: