首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MASM计算复合材料

MASM计算复合材料
EN

Stack Overflow用户
提问于 2015-07-15 05:24:31
回答 2查看 1.4K关注 0票数 1

我正在尝试运行要求用户输入1到400之间的输入的代码,并给出该组合的数量。例如。输入31将得到4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 34 35 36 38 39 40 42 44 45 46

当我尝试运行以下代码时,它会崩溃:

代码语言:javascript
复制
        userInt1    DWORD   ?           ;integer to be entered by user
    userInt2    DWORD   ?           ;integer to be entered by user
    intro_1     BYTE    "Composite Numbers  by. Eric Walters" , 0
    prompt_1    BYTE    "Enter the number of composite numbers you would like to see. ", 0
    prompt_2    BYTE    "I'll accept orders for up to 400 composites. ", 0
    prompt_3    BYTE    "Enter the number of composites to display [1 .. 400]: ", 0
    prompt_4    BYTE    "Test", 0
    prompt_6    BYTE    "Results certified by Eric Walters.",0
    prompt_7    BYTE    "Goodbye, ", 0
    outOfRange  BYTE    "Out of range. Try again.",0
    goodBye     BYTE    "Impressed? Bye! ", 0
    upperLevel  DWORD   400         ;the largest integer allowed
    lowerLevel  DWORD   1           ;the smallest integer allowed
    newArray    DWORD   500 DUP(?)


.code
main PROC

push    OFFSET newArray
push    ebp
mov     ebp,esp
mov     esi,[ebp + 8]


; Introduction  

    mov     edx, OFFSET intro_1
    call    WriteString
    call    CrLf
    call    CrLf
    mov     edx, OFFSET prompt_1
    call    WriteString
    call    CrLf
    mov     edx, OFFSET prompt_2
    call    WriteString
    call    CrLf
    call    CrLf

; getUserData
    userPrompt:
        mov     edx, OFFSET prompt_3
        call    WriteString
        call    ReadInt
        mov     userInt1, eax
        mov     eax, userInt1

    ;validate   
        cmp     eax, upperLevel
        ja      option1
        cmp     eax, lowerLevel
        jb      option1
        jmp     option2

    option1 :
        mov     edx, OFFSET outOfRange
        call    WriteString
        call    crlf
        jmp     userPrompt

    mov     ecx, 4
    option2 :
        cmp     ecx, userInt1
        jnle    done
        mov     ebx, 2  

    showComposites :
        mov     edx, ecx
        sub     edx, 1
        cmp     ebx, edx
        jge     L1
        mov     eax, ecx
        div     ebx
        cmp     edx, 0
        je      composite

    resume :
        inc     ebx
        jmp     showComposites

    L1:
        inc     ecx
        jmp     option2

    done :
        pop     ebp
        ret     4

    composite:
        mov     [esi], ecx
        add     esi, TYPE DWORD
        jmp     L1

; farewell
    mov     edx, OFFSET prompt_6
    call    WriteString
    call    crlf
    mov     edx, OFFSET prompt_7
    call    WriteString
    call    crlf


    exit        ; exit to operating system
main ENDP

END main

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2015-07-15 16:24:11

假设你没有失败的汇编一个exe,所以你的EXTRN/PUBLIC声明是正确的。

代码语言:javascript
复制
jmp     userPrompt

mov     ecx, 4           ;Useless code?

option2 :
cmp     ecx, userInt1    ;Not understanding when ECX is initialized and
jnle    done             ;why, was it suppose to be the above code
mov     ebx, 2           ;that is misplaced?

这部分把我弄糊涂了,现在我不明白你的顺序合成数的算法。

这里有一个想法:为什么不设置一个由1-400个组合数字组成的数组,并让用户输入1-400之间的数组作为循环计数器,以显示每个数组元素?(不过,在时间和内存方面不如优秀的算法高效。)

票数 0
EN

Stack Overflow用户

发布于 2015-07-15 21:02:10

我没有运行你的代码,我想说实话:我讨厌NASM和它所有的高级指令和宏。

我最好的猜测是

代码语言:javascript
复制
    push    OFFSET newArray
    push    ebp
    mov     ebp,esp
    mov     esi,[ebp + 8]

    ;Whole lotta stuff

done:
    pop     ebp
    ret     4

也许你是在复制粘贴代码,我不知道,但这会将主进程的返回地址设置为newArray的地址,并将在返回时崩溃。

我看到您试图将数组作为参数传递,但没有您调用的函数。

代码的其余部分,除了Nhat M Le在答案中突出显示的点之外,应该可以工作,或者需要进行微小的调整(请注意,我还没有运行它)。

我可以给你一些建议吗?

1.描述算法和问题

当你发布代码,特别是汇编代码时,给出你正在实现的算法的一般描述。

特别是当有空间容纳整个范围的算法时:从尝试除法的初学者使用,到更通用的polynomial time primality test版本,通过切割器和对sieve的直观使用

此外,还应包括您面临的具体问题。

这可以帮助我们找出问题,而不是试图进入你的大脑,阅读大量的,可能是非常糟糕的代码。

2.相应地将变量命名为

比方说,与使用upperLimitdwUpperLimitui32UpperLimit相比,您是否真的能更好地使用userInt1

3.知道您的数据大小

努力识别哪些数据应该在运行时占用内存空间,哪些不应该。

upperLevellowerLevel最好用EQU (或任何MASM等效物)来声明。

如果您最多支持400个数字,为什么还要为阵列分配500个DWORD?

我可能遗漏了一些东西,但如果我不是,这可能是懒惰或对编程不感兴趣的态度的症状,如果你对编程感兴趣,就摆脱它。

我并不期望您知道如何正确使用pi(x) function和评估技术,但您最多需要400个EQU (专业提示:与Point2 DWORD使用合并)。

4.使用functions将问题划分为子问题

这确实有助于调试和防止汇编中的错误。

5.缩进代码并使其保持清晰

汇编代码没有缩进规则,但作为人类,我们会自动找到一种阅读起来很愉快的样式。

记住在物理上分离逻辑上不同的代码片段,你用标题注释做了一些事情,但是整个循环逻辑是混乱的,如果你继续用汇编语言编程,你会发现你可以写出非常清晰的代码,即使有多次跳转。

这一切只是为了给开个玩笑,,并回答你的数据问题

代码语言:javascript
复制
goodBye     BYTE    "Impressed? Bye! ", 0

使用数据答案

代码语言:javascript
复制
strGoodBye db "Not very much :)", 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31417664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档