汇编代码有什么问题要计算列表中正元素的数量

时间:2011-02-10 02:23:55

标签: assembly

请使用tasm告诉下面的汇编代码有什么问题,我根本无法获得任何输出。

从tasm输出

D:\tasmzip\tasmzip>tasm test1.asm
Turbo Assembler  Version 1.0  Copyright (c) 1988 by Borland International

Assembling file:   TEST1.ASM
Error messages:    None
Warning messages:  None
Remaining memory:  453k


D:\tasmzip\tasmzip>tlink test1.obj
Turbo Link  Version 2.0  Copyright (c) 1987, 1988 Borland International

D:\tasmzip\tasmzip>test1

D:\tasmzip\tasmzip>

我的代码:

ASSUME  CS:CODE , DS : DATA
ORG 0000H
DATA SEGMENT
    LIST DB 2,23,11,7,5,25,13,18,0    ; Given Array with last element zero to indicate end of array
 DATA ENDS
CODE SEGMENT  
    ORG 2000H

   START :  lEA SI , list

    MOV CL,0
    MOV AL,0 

    AGAIN: CMP AL,[SI]  ; look for end of 
     JE over
     INC SI  
     INC CL
     Jmp AGAIN       

     over :   MOV AH,4C
              INT 21H

  CODE ENDS  
END START  

2 个答案:

答案 0 :(得分:1)

您没有打印出答案,只是退出0作为返回值。您需要添加更多系统调用以在循环后打印CL中的值。

答案 1 :(得分:0)

您的所有代码段都在计算它们,您仍需要在完成后输出值。

如果计数小于10,您可以使用简单的:

over:  push  cx           ; transfer cl to dl for int21/ah=2.
       pop   dx
       add   dx, 30h      ; convert number to character.
       mov   ah, 02h      ; prints the character in dl.
       int   21h
       mov   ah, 4ch      ; exit.
       int   21h

就打印字符串而言,您可以使用int21,ah = 9。 Ralf Brown's interrupt list是这种东西的绝佳资源。

输出大于9的数字时,你必须进行正常的除法/模数欺骗。

可以找到一些可以执行此操作的代码here,但您可以使用类似com文件的内容:

0100            mov   si, numlist       ; get the list base.
0103            mov   cl, 0             ; counter initially zero.

0105 loop1:     mov   al, 0             ; stop on sentinel of zero.
0107            cmp   al, [si]
0109            je    pr_pre
010B            inc   si                ; otherwise advance and increase count.
010C            inc   cl
010E            jmp   loop1             ; and go back for more.

0110 pr_pre:    mov   ah, 09            ; output the initial text.
0112            mov   dx, pretext
0115            int   21

0117 hundreds:  mov   dl, 30            ; process hundreds digit, initially '0'.
0119            jmp   skip2             ; skip initial.
011B loop2:     inc   dl                ; add 1 to count, sub 100 from tally
011D            sub   cl, 64
0120 skip2:     cmp   cl, 64
0123            jge   loop2             ; continue until < 100
0125            mov   ah, 02            ; print character.
0127            int   21

0129 tens:      mov   dl, 30            ; process tens digit, same as hundreds.
012B            jmp   skip3
012D loop3:     inc   dl
012F            sub   cl, 0a            ; except use 10 rather than 100
0132 skip3:     cmp   cl, 0a
0135            jge   loop3
0137            mov   ah, 02
0139            int   21

013B units:     mov   dl, cl            ; what's left is units.
013D            add   dl, 30            ; just add '0' and print.
0140            mov   ah, 02
0142            int   21

0144 pr_post:   mov   ah, 09            ; the print CR/LF.
0146            mov   dx, 15e
0149            int   21

014B exit:      mov   ah, 4c            ; and exit.
014D            int   21

014F pretext:   db    "The count is: $"
015E posttxt:   db    0a, 0d, "$"
0161 numlist:   db    1,2,3,4,5,6,7,8,9
016a            db    10,11,12,13,14,0