Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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_Number Formatting_X86 16 - Fatal编程技术网

Assembly 汇编语言中的数字

Assembly 汇编语言中的数字,assembly,number-formatting,x86-16,Assembly,Number Formatting,X86 16,大家好,我是汇编语言的初学者,有谁能帮助我理解如何在汇编语言x86中处理数字。 当我处理任何与数字有关的任务时,我会遇到困难,我不能执行像shl,shr,mul,div两位数加法这样的程序。如果有人能解释或分享以下代码,我将非常感激 比如: Mov Al 2 Mov Bx 2 mul bx mov dx,bx mov ah,2 int 21h 但是它不能显示正确的输出。如果我通过减去30h来转换它,它会以符号的形式显示,即使它不能显示正确的答案 我不能执行像shl,shr,mul,div

大家好,我是汇编语言的初学者,有谁能帮助我理解如何在汇编语言x86中处理数字。 当我处理任何与数字有关的任务时,我会遇到困难,我不能执行像
shl
shr
mul
div
两位数加法这样的程序。如果有人能解释或分享以下代码,我将非常感激

比如:

Mov Al 2
Mov Bx 2
mul bx

mov dx,bx
mov ah,2
int 21h 
但是它不能显示正确的输出。如果我通过减去
30h
来转换它,它会以符号的形式显示,即使它不能显示正确的答案

我不能执行像
shl
shr
mul
div

shl
shr
mul
div
是指令。请不要把它们称为程序

。。。我通过减去30小时来掩盖它

在下面的代码中可以看到,转换要求您添加30小时而不是减去30小时

您可以更正此程序,它将两个单位数相乘

错误1:选择正确的大小乘法。使用
mul-bx
,您已经计算出了
DX:AX=AX*bx
,在这种情况下,这是一种过度杀伤力。此外,由于您忘记了归零
,您得到了随机结果

mov al, 2
mov bl, 2
mul bl       ; -> AX = AL * BL
错误2:将数字4(2*2)的结果转换为字符“4”。
还要注意,
mul
指令的结果不能在
BX
寄存器中找到,就像您的代码正在思考的那样(
mov-dx,BX
)。
mul-bl
将其结果保留在
AX
中,由于该值非常小,我们只需使用
AL
(AX的下半部分)

需要注意的是,这种非常简单的显示结果的方法只能用于0到9之间的结果


要显示超出[0,9]范围的数字,请查看。文本非常详细地解释了如何将任何数字转换为文本表示并输出到屏幕。

在汇编中,您可以读取和写入字符。如果需要数字值,则必须将字符值转换为数字,然后将数字组合为要创建的任何类型。请参阅屏幕上由两个ASCII字符组成的两位数。如
mov-dl、'2'mov-ah、2 int-21h mov-dl、'5'mov-ah、2 int-21h
将在屏幕上输出“25”。在该示例中根本没有使用实际值
25
。DOS没有输出数字的服务。您必须首先将数字转换为字符。见:。。。如果您只是在学习汇编基础知识,请完全跳过字符串内容,并使用调试器验证数值是否正确。稍后再处理字符串,届时您将有算术和内存操作的经验。非常感谢您的精彩解释。
mov al, 2
mov bl, 2
mul bl       ; -> AX = AL * BL
add al, "0"  ;"0" = 30h
mov dl, al
mov ah, 02h
int 21h