[英]How to display a 2 digit number in assembly language after mathematical operations?
您好,我需要乘以 3 的乘积,即乘积小于 100。我有计算权,但无法显示最终乘积的两位数。 例如你输入 3 5 2 你应该得到 30 到 output。 数字之间也有空格,期待第一个输入数字,所以它会 go 3(空格)5(空格)2
section .bss
num1 resb 2
num2 resb 2
num3 resb 1
answer1 resb 2
tensdig resb 1
onesdig resb 1
section.text 全局 _start
_开始:
mov eax,3
mov ebx,0
mov ecx,num1 ;1st value
mov edx,2
int 80h
mov eax,3
mov ebx,0
mov ecx,num2 ;2nd value
mov edx,2
int 80h
mov eax,3
mov ebx,0
mov ecx,num3 ;3rd value
mov edx,1
int 80h
sub [num1], word '0'
sub [num2], word '0'
sub [num3], word '0'
mov al, [num1]
mov bl, [num2] ; multiply first 2 values
mul bl
mov [answer1], al ; move product to al
mov ax, [answer1]
mov bx, [num3]
mul bx
;move final answer to ax
mov [answer1], ax
;divide by 10
mov ax, 0
mov ax, [answer1]
mov bx, 10
div bx
mov [tensdig], ax
mov[onesdig], dx
add [tensdig], word '0'
add [tensdig], word '0'
mov eax,4
mov ebx,1
mov ecx, tensdig ; print first digit
mov edx,1
int 80h
mov eax,4
mov ebx,1
mov ecx, onesdig ;print 2 digit
mov edx,1
int 80h
mov eax,1
mov ebx,0
int 80h;
您的数据大小似乎都混在一起了。 您正在使用word
指令(即 16 位)执行所有操作,但您的所有实际值都是单字节。 与高级语言不同,您不能指定变量的类型,然后假设所有操作都会自动尊重该类型。 您必须为每个实例中的类型编写正确的指令。 对于一个寄存器和一个 memory 操作数的指令,数据大小由寄存器大小推断,例如al
为 8 位, ax
为 16 位。
原则上,您可以将缓冲区num1
视为 16 位值,其中高字节将是空格字符,但只使用实际包含数字的字节并忽略包含空格的字节会更简单。
编写加载值并进行乘法的部分的更正确方法是:
mov al, [num1]
mov bl, [num2]
mov cl, [num3]
sub al, '0' ; note: 8-bit subtraction
sub bl, '0'
sub cl, '0'
mul bl
; the result of the first multiplication is in ax.
; the low byte of ax is al, and we are assured that the
; result fits in 8 bits, so we can just use al as the input
; for the next multiply
mul cl
; now the result is in al and you can proceed to compute the output characters.
无需将中间结果存储回 memory 作为answer1
。 访问寄存器比 memory 更快、更高效,您可以而且应该尽可能将数据保存在寄存器中,仅在真正需要时才写入 memory。
此处还可以进行其他优化,但我省略了它们以使代码更易于理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.