assembly HLA装配中如何正确划分数字

rkue9o1l  于 2023-02-16  发布在  其他
关注(0)|答案(3)|浏览(93)

我在HLA nasm中得到了Integer overflow。我想写一个简单的程序,将提供的Distance变量除以15000并显示它的求值,但我遇到了这个问题。我根本不明白HLA中除法的概念。提前感谢您的帮助。

program zad2;
#include( "stdlib.hhf");

static
    f    :  int32   := 15000;
    s    :  int32   := 300000;
    Distance: int32;

begin zad2;

        stdout.put("Give car distance", nl);
        stdin.get(Distance);
        if (Distance<150000) then
            MOV(15000, eax);
            div(Distance, EDX:EAX );
                stdout.put("div evaluation:",eax ,nl);
                    jmp menu0;
            endif
end zad2;
iyfjxgzm

iyfjxgzm1#

mov(0, edx)
mov(15000, eax);
div(distance, edx:eax);

你需要零扩展到edx,因为它是保存余数的寄存器。

rwqw0loc

rwqw0loc2#

我找到了我的解决方案。请看一下。所有hla div的东西在Windows版本的hla编译器上都不能正常工作。它应该是这样的。我希望它能对某人有所帮助;)

mov(Distance, eax);
mov(15000, ebx);
div(ebx);
mov(eax, age);
kwvwclae

kwvwclae3#

我也一直在研究Divi与HLA的配合使用(高级汇编)。我想分享我的发现也是为了帮助别人。这个程序不是课堂作业,因为我们必须手工做每件事并展示我们的工作。我只是为了一些额外的练习而写了这个简短的程序,所以我想为什么不分享它呢,它对检查我的工作效果很好,加上它有除法使用在它。这个程序将采取一个字符转换成十六进制到十进制和转换后,它到二进制,为了进行二进制转换,IS在while循环内使用idiv,并且从64到32到16到8到4到2到1一半。

//Jonathan Lee Sacramento State University
    //CSC35
    //Professor Devin Cook
    //Feb 11 2023
    //Non-Credit Practice program with Asci/hex/decimal

    //Program: This is a HLA program that converts ASCII/HEX/DECIMAL/BINARY 
    based off one letter input

    program binarydiv;
    #include( "C:\hla\include\stdlib.hhf"); 

    static
        UserChar: char;
        i8:  int8 :=0; //value

    begin binarydiv;
        stdout.put("---> Please enter one character: ");
        stdin.get(UserChar); //store as char
        stdout.put("You Entered: ",UserChar);
        mov(UserChar,al); // store hex value of char into al reg
        stdout.put(nl,"(",UserChar,") In Hex is: ", al); //show hex value
        mov(al,i8); //move hex into int8 
        stdout.put(nl,"(",UserChar,") In Decimal is: ",i8); //show decimal value
        stdout.put(nl,"(",UserChar,") In Binary is: 0"); //start of binary not using 128
        mov(64,cl); //use cl with operators 2nd binary
        while(cl>0) do
            if(i8>=cl) then 
                stdout.put("1");
                sub(cl,i8);
            elseif(i8<cl) then
                stdout.put("0");
            endif; 
    //div block
            mov(cl,al);
            cbw();
            mov(2,bl);
            idiv(bl);
            mov(al,cl);
    //end div block
        endwhile;
        stdout.put(nl);
    end binarydiv;

相关问题