"base 10" EMU8086 减法程序集
Subtraction assembly with "base 10" EMU8086
你好,我正在用汇编程序制作一个以 10 为基数的计算器,它可以接受最大长度为 5 位的数字...所以在输入后有两个数字,五个数字中的一个存储在 ax 中,并且例如bl
AX - 23 45
BX - 00 01
所以输入的值是 12345
而另一个是例如 23243
并且它存储在 CX
和 DX
上具有相同的想法第一个数字(存储在 AX
和 BX
...)现在,我已经制作了加法代码,但我无法弄清楚如何制作带有所有否定问题的减法代码......
所以我想做的是,例如,取 bh(我没有使用,因为数字不能超过 6 位...),如果数字是负数,我会输入 1如果它是肯定的,我会把 0 这样这个问题就解决了,现在的问题是我不知道如何使代码像所有 sub
部分和进位以及所有东西一样工作......(在另外,我使用了 adc、daa 等命令...)
最后一个例子:
值为:12345 及其正值
AX - 23 45
BX - 00 01
(if Bh is 0 the number is positive if 1 its negative...)
现在的值为:23243 及其正值
CX-32 43
DX-00 02
计算
12345-23243(= -10898)
假设答案是 CX 和 DX
所以它看起来像这样:
CX - 08 98
DX - 01 01
答案:(-10898)
有人可以帮我 me/give 我知道如何做的示例代码吗?
对不起,如果我有点困惑...
谢谢。
编辑:
这是您要求的附加代码:
proc Add_two_numbers;2 values useing stack...
pop [150]
pop dx
pop cx
pop bx
pop ax
add al,cl
daa
mov cl,al
mov al,ah
adc al,ch
daa
mov ch,al
mov al,bl
adc al,dl
daa
mov dl,al
push cx
push dx
push [150]
ret
endp Add_two_numbers
第二次编辑:
我弄清楚如何使它为负,所以我只需要子 2 的算法,它不需要使用 1000-2000 这样的数字,请让它只对 2000-1000
这样的正值起作用
回答你的评论,这是一种你可以使用 C 作为示例从十进制转换回来的方法。我让你用 asm 编码!
#include <conio.h>
#define MAX 100000000
// input a signed decimal number
int inp_num(void) {
int number=0, neg=0, key;
while (number < MAX) {
key = _getche();
if (key == '-') {
if (number==0)
neg = 1; // else ignore
}
else if (key >= '0' && key <= '9')
number = number * 10 + key - '0';
else
break;
}
if (neg)
number = -number;
_putch('\n');
return number;
}
// output a signed number as decimal
void out_num(int number) {
int digit, suppress0, d;
suppress0 = 1; // zero-suppression on
if (number < 0) {
_putch('-');
number =-number;
}
for (d=MAX; d>0; d/=10) {
digit = number / d;
if (digit) // if non-0
suppress0 = 0; // cancel zero-suppression
if (!suppress0)
_putch('0' + digit);
number -= digit * d;
}
}
int main(void) {
int number;
number = inp_num();
out_num(number);
return 0;
}
你好,我正在用汇编程序制作一个以 10 为基数的计算器,它可以接受最大长度为 5 位的数字...所以在输入后有两个数字,五个数字中的一个存储在 ax 中,并且例如bl
AX - 23 45
BX - 00 01
所以输入的值是 12345
而另一个是例如 23243
并且它存储在 CX
和 DX
上具有相同的想法第一个数字(存储在 AX
和 BX
...)现在,我已经制作了加法代码,但我无法弄清楚如何制作带有所有否定问题的减法代码......
所以我想做的是,例如,取 bh(我没有使用,因为数字不能超过 6 位...),如果数字是负数,我会输入 1如果它是肯定的,我会把 0 这样这个问题就解决了,现在的问题是我不知道如何使代码像所有 sub
部分和进位以及所有东西一样工作......(在另外,我使用了 adc、daa 等命令...)
最后一个例子: 值为:12345 及其正值
AX - 23 45
BX - 00 01
(if Bh is 0 the number is positive if 1 its negative...)
现在的值为:23243 及其正值 CX-32 43 DX-00 02
计算 12345-23243(= -10898)
假设答案是 CX 和 DX 所以它看起来像这样:
CX - 08 98
DX - 01 01
答案:(-10898)
有人可以帮我 me/give 我知道如何做的示例代码吗?
对不起,如果我有点困惑...
谢谢。 编辑: 这是您要求的附加代码:
proc Add_two_numbers;2 values useing stack...
pop [150]
pop dx
pop cx
pop bx
pop ax
add al,cl
daa
mov cl,al
mov al,ah
adc al,ch
daa
mov ch,al
mov al,bl
adc al,dl
daa
mov dl,al
push cx
push dx
push [150]
ret
endp Add_two_numbers
第二次编辑: 我弄清楚如何使它为负,所以我只需要子 2 的算法,它不需要使用 1000-2000 这样的数字,请让它只对 2000-1000
这样的正值起作用回答你的评论,这是一种你可以使用 C 作为示例从十进制转换回来的方法。我让你用 asm 编码!
#include <conio.h>
#define MAX 100000000
// input a signed decimal number
int inp_num(void) {
int number=0, neg=0, key;
while (number < MAX) {
key = _getche();
if (key == '-') {
if (number==0)
neg = 1; // else ignore
}
else if (key >= '0' && key <= '9')
number = number * 10 + key - '0';
else
break;
}
if (neg)
number = -number;
_putch('\n');
return number;
}
// output a signed number as decimal
void out_num(int number) {
int digit, suppress0, d;
suppress0 = 1; // zero-suppression on
if (number < 0) {
_putch('-');
number =-number;
}
for (d=MAX; d>0; d/=10) {
digit = number / d;
if (digit) // if non-0
suppress0 = 0; // cancel zero-suppression
if (!suppress0)
_putch('0' + digit);
number -= digit * d;
}
}
int main(void) {
int number;
number = inp_num();
out_num(number);
return 0;
}