相乘然后除以 nasm

Multiplying then dividing in nasm

我只是想学习 nasm 中的乘法和除法,并一直在尝试用户输入,但它对我不起作用。我只是想乘以 2*3/2 所以我的输入是 2 3 2 并且它打印出一个 ascii 空白字符。我猜它添加或减去“0”以将 ascii 更改为 ints?我在哪里放置子“0”或添加“0”,为什么?

segment .data 
    
    segment .bss
    ;defining all variables
       num1 resb 2 ;num1 2 bytes
       num2 resb 2 ;nums2 2 bytes
       num3 resb 2 ;num2 2 bytes
    ;result
       res resb 1
    
    section .text
       global _start    ;must be declared for using gcc
        
    _start:             ;tell linker entry point
    
         
       ;reading num 1
       mov eax, 3 ;read
       mov ebx, 0  ;input
       mov ecx, num1 ;variable
       mov edx, 2 ;bytes
       int 0x80  ;end
    
    ;reading num 2
       mov eax, 3 ;read
       mov ebx, 0 ;input
       mov ecx, num2 ;variable
       mov edx, 2 ;bytes
       int 0x80   ;end
       
     ;reading num 3
       mov eax, 3 ;read
       mov ebx, 0  ;input
       mov ecx, num3 ;variable
       mov edx, 2 ;bytes
       int 0x80 ;end
       ; and subtracting ascii '0' to convert it into a decimal number
       
     
  
       ;moving variables in lower halfs
       mov ax, [num1]
       sub ax, '0'
       mov bx, [num2]
       sub bx, '0'
       ; multiply al and bl
       mul bx
       sub ax, '0'
       mov cx, [num3]
       sub cx, '0'
     ;dividing ax/cx
       div cx
       add ax, '0'
       mov [res], ax
    

mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

mov ecx,res
mov edx, 1
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
     
  
    
    exit:    
       mov eax, 1
       int 0x80

但我的输出总是 � 或者什么都没有。我只是在数字中加“0”或减“0”吗?

I am just trying to multiply 2*3/2 so my input is 2 3 2

因为您使用的是这些小的个位数,所以计算可以非常简单。

但是您似乎对事物的尺寸有疑问。我已经在我对 的回答中告诉过你了。单个数字要存储在字节大小的寄存器中,并且字节大小的结果必须通过字节大小的操作写入字节大小的res变量。

mov al, [num1]
sub al, '0'    ; Converting from character to number
mov bl, [num2]
sub bl, '0'    ; Converting from character to number

当你说“将 al 和 bl 相乘”时,为什么要执行将 AXBX 相乘的 mul bx

mul bl         ; Product is in AX

此时,您仍然需要对数字进行除法,因此您还不应该对其进行任何转换sub ax, '0'

mov cl, [num3]
sub cl, '0'    ; Converting from character to number

再次“划分 ax/cx”需要清除 DX,但更重要的是,您实际上需要此处的字节大小划分:

div cl         ; Divides AX by CL, producing quotient in AL
add al, '0'    ; Converting from number to character
mov [res], al  ; Storing the single character, so use byte-sized operation

mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

这些行是多余的,可以解释看到显示 � 是因为 ECXEDX 此时未设置。


To convert from character to number, you subtract 48.
To convert from number to character, you add 48.

“0”的ASCII码是48,所以减去48得到数字0
“1”的 ASCII 码是 49,所以减去 48 得到数字 1
"2" 的 ASCII 码是 50,所以减去 48 得到数字 2
...
"9" 的 ASCII 码是 57,所以减去 48 得到数字 9