繁体   English   中英

数学运算后如何用汇编语言显示2位数字?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM