Assembly 汇编计算器
我的任务如下: 编写一个完整的8086程序来执行计算器功能:ADD/SUB/DIV/MUL。 当用户按下“=”时,程序应显示结果。仅输入0-9之间的数字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
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,如果这回答了你的问题,你应该点击它旁边的复选标记。