NASM大会数理逻辑 [英] NASM Assembly mathematical logic

查看:138
本文介绍了NASM大会数理逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在装配为是应该通过一系列数学运算的工作,最后的值进行比较,以20 Linux终端有一个程序,并且如果逻辑随后使用,报告与所述;,>或=关系。 code是:

I have a program in assembly for the Linux terminal that's supposed to work through a series of mathematical manipulations, compare the final value to 20, and then using if logic, report <, > or = relationship. Code is:

segment .data

out_less     db "Z is less than 20.", 10, 0
out_greater  db "Z is greater than 20.", 10, 0
out_equal    db "Z is equal to 20.", 10, 0

segment .bss

segment .text

global main
extern printf

main:

    mov    eax, 10
    mov    ebx, 12
    mov    ecx, eax
    add    ecx, ebx    ;set c (ecx reserved)

    mov    eax, 3
    mov    ebx, ecx
    sub    ebx, eax    ;set f (ebx reserved)

    mov    eax, 12
    mul    ecx
    add    ecx, 10     ;(a+b*c) (ecx reserved)

    mov    eax, 6
    mul    ebx
    mov    eax, 3
    sub    eax, ebx
    mov    ebx, eax    ;(d-e*f) (ebx reserved) reassign to ebx to free eax

    mov    eax, ecx
    div    ebx
    add    ecx, 1      ;(a+b*c)/(d-e*f) + 1

    cmp    ecx, 20
    jl     less
    jg     greater
    je     equal

    mov    eax, 0
    ret

less:

    push    out_less
    call    printf
    jmp     end

greater:

    push    out_greater
    call    printf
    jmp     end

equal:

    push    out_equal
    call    printf
    jmp     end

end:

    mov     eax, 0
    ret

命令使用NASM和gcc在终端编译:

Commands for compiling in terminal using nasm and gcc:

nasm -f elf iftest.asm
gcc -o iftest iftest.o
./iftest

等价的C code将是:

Equivalent C code would be:

main() {
    int a, b, c, d, e, f, z;
    a = 10;
    b = 12;
    c = a + b;
    d = 3;
    e = 6;
    f = c - d;
    z = ((a + b*c) / (d - e*f)) + 1;

    if (z < 20) {
        printf("Z (%d) is less than 20.\n", z);
    }
    else if (z > 20) {
        printf("Z is greater than 20.\n");
    }
    else {
        printf("Z is equal to 20.\n");
    }
}    

的电流输出不正确。在C $ C $按c报告Z = -1,因此,低于20,但是装配code输出 Z是大于20。我已经试着打印出最终值,但我遇到了这个问题,即打印的价值在某种程度上改变它。我已经检查和复查的数学逻辑,我看不出为什么它不应该给予正确的价值,除非我使用的数学运算符不正确。任何及所有帮助AP preciated。

The current output is incorrect. The C code will report that z = -1, and therefore less than 20, but the assembly code outputs Z is greater than 20. I've tried printing out the final value, but I run into this issue where printing the value somehow changes it. I've checked and rechecked the math logic and I can't see why it shouldn't give the correct value, unless I'm using the math operators incorrectly. Any and all help is appreciated.

推荐答案

我认为这个问题是在这里:

I think the problem is here:

div    ebx
add    ecx, 1      ;(a+b*c)/(d-e*f) + 1

DIV 指令的结果是不是在 ECX

这篇关于NASM大会数理逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆