相乘然后除以 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 相乘”时,为什么要执行将 AX
与 BX
相乘的 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
这些行是多余的,可以解释看到显示 � 是因为 ECX
和 EDX
此时未设置。
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
我只是想学习 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
因为您使用的是这些小的个位数,所以计算可以非常简单。
但是您似乎对事物的尺寸有疑问。我已经在我对
mov al, [num1]
sub al, '0' ; Converting from character to number
mov bl, [num2]
sub bl, '0' ; Converting from character to number
当你说“将 al 和 bl 相乘”时,为什么要执行将 AX
与 BX
相乘的 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
这些行是多余的,可以解释看到显示 � 是因为 ECX
和 EDX
此时未设置。
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