Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编计算器_Assembly_X86 - Fatal编程技术网

Assembly 汇编计算器

Assembly 汇编计算器,assembly,x86,Assembly,X86,我的任务如下: 编写一个完整的8086程序来执行计算器功能:ADD/SUB/DIV/MUL。 当用户按下“=”时,程序应显示结果。仅输入0-9之间的数字 ones db ? tens db ? mov ah,1 int 21h add al,30H mov tens, al mov ah,1 int 21H mov dl,al cmp dl, '+' je

我的任务如下:

编写一个完整的8086程序来执行计算器功能:ADD/SUB/DIV/MUL。 当用户按下“=”时,程序应显示结果。仅输入0-9之间的数字

    ones  db ?
    tens  db ?

    mov   ah,1
    int   21h
    add   al,30H
    mov   tens, al
    mov   ah,1       
    int   21H 
    mov   dl,al
    cmp   dl, '+'
    je    addition

addition:
    mov   ah,1    
    int   21h
    mov   bl,al   
    mov   ones,al

我必须把每个数字加上30小时,然后减去它。有人能解释一下我是如何做到这一点的吗?

0x30是ASCII中的0符号,因此如果要打印0-9之间的数字,应将0x30添加到值中,使其成为“0”字符。如果从终端读取,则将读取0x30而不是0,因此如果要使用它进行计算,则需要减去0x30以将“0”字符转换为值0


试着用C或其他语言编写(不要在大部分代码中使用任何C库,只使用简单语言)

我想你是在接受ASCII值,然后吐出ASCII值

看看ASCII图表,0的ASCII是0x30,也是十进制48或二进制0B0011000 1是0x31,2是0x32,以此类推,以二进制表示:

0 0b00110000
1 0b00110001
2 0b00110010
3 0b00110011
4 0b00110100
5 0b00110101
6 0b00110110
7 0b00110111
8 0b00111000
9 0b00111001
如果要添加数字9和8,则可能需要在寄存器中添加0x09和0x08,而不是0x39和0x38。0x09+0x08=0x11 0x39+0x38=0x71

0x11 0b00010001
0x71 0b01110001
如果在执行任何操作之前不从ascii转换,则可能很难从结果中可靠地提取正确的位。加法还不错,你可以用黑客破解它,但可以进入乘法,等等,它可能不那么漂亮。你必须自己解决这个问题

然后你需要从二进制结果返回到ascii,我假设你想用ascii打印结果

如何从十进制数为17的0x11转换为ascii 0x31、0x37?如果有人问你78英寸有多少英尺,答案是什么?你从英尺除以12开始,对,你得到6,剩下的6,也就是6英尺6英寸。4000秒内有多少小时、分钟、秒?4000/3600=1余数400,400/60=6余数40,1:06:40。如果我问我是否有数字123,我如何从数学上提取百、十和一(这样我可以将0x30添加到每个数字中,并将它们打印为ASCII)


因此,添加9和8可能会得到0B001111001和0b00111000以及加号和等号作为输入,在进行加法之前,需要将0x00111001转换为0x00001001,将0x00111000转换为0x00001000,然后将结果0x0001001转换为0x00000001(十)和0x00000111(一)然后在打印之前,将0x00000001更改为0x00110001(十)(ascii),将0x00000111更改为0x00110111(一)(ascii)。

作业应标记为作业:)我必须在每个数字上加上30小时,然后减去它。有人能给我解释一下吗?← 有些东西告诉我你没有写那个代码。@lana,如果这回答了你的问题,你应该点击它旁边的复选标记。