assembly 如何解决汇编中的乘法问题

k7fdbhmy  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(156)

我是汇编的新手,试图解决算术问题。你如何在汇编中添加,sub,穆尔,或div?更可取的是想要一个例子,所有的机会和int 21h是什么意思?

section .bss
    num resb 2
    number resb 2
   
    product resb 2

section .text
    global _start

_start:

    mov eax,3            
    mov ebx,0            
    mov ecx,num    
    mov edx,2    
    int 80h           
    
 
    mov eax,3            
    mov ebx,0            
    mov ecx,number    
    mov edx,2  
    int 80h           

    
    
    mov al, [num]
    mov bl, [number] 
    mul bl 
    
    mov [product], ax 
    
  

    mov eax,4            
    mov ebx,1            
    mov ecx,product    
    mov edx,2    
    int 80h    
    


   
 

 
    mov eax,1            
    mov ebx,0            
    int 80h;
bkhjykvo

bkhjykvo1#

你的数据大小看起来很混乱。你用word指令做所有的事情,也就是16位,但是你所有的实际值都是单字节的。与高级语言不同,你不能指定一个变量的类型,然后假设所有的操作都会自动遵守该类型。你必须在每个示例中为该类型编写正确的指令。对于具有一个寄存器和一个存储器操作数的指令,数据大小是从寄存器的大小推断的,例如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.

没有必要将中间结果以answer1的形式存储回内存。寄存器比内存访问更快、更有效,您可以也应该尽可能将数据保存在寄存器中,只有在真正需要时才写入内存。
这里还可以进行其他优化,但为了使代码更易于理解,我将它们省略了。

相关问题