Assembly 乘/除2.0
我最近发布了一个我一直在使用的乘法-除法菜单(再次感谢大家的输入!),但我最近放弃了该代码,在一位有汇编语言经验的朋友的帮助下,我知道我现在有了一些我认为更接近最终产品的东西。但当我终于回到家把它组装起来时,我意识到他一直在向我展示一些他知道的NASM,这对MASM不太管用!我一直在一个接一个地尝试使用在线指南将任何不起作用的位转换为它们的MASM等价物。但现在我想我已经到了需要外界帮助的地步。我收到两个链接器错误LNK2001未解析的外部符号\u WinMainCRTStartup和LNK1120 1未解析的外部 如果有人能帮我排除故障,或者如果其他人的系统可以运行,这看起来有效吗Assembly 乘/除2.0,assembly,masm,Assembly,Masm,我最近发布了一个我一直在使用的乘法-除法菜单(再次感谢大家的输入!),但我最近放弃了该代码,在一位有汇编语言经验的朋友的帮助下,我知道我现在有了一些我认为更接近最终产品的东西。但当我终于回到家把它组装起来时,我意识到他一直在向我展示一些他知道的NASM,这对MASM不太管用!我一直在一个接一个地尝试使用在线指南将任何不起作用的位转换为它们的MASM等价物。但现在我想我已经到了需要外界帮助的地步。我收到两个链接器错误LNK2001未解析的外部符号\u WinMainCRTStartup和LNK11
TITLE mainmenu
; Description: This program presents a menu that will prompt the user decide whether they wouldd like to multiply or divide. The programs reads the numbers in the range 1 to 100. If an invalid selection is made the program will close.
; Revision date: 4/29/2017
INCLUDE Irvine32.inc
.data
.code
main PROC
; Messages
msg1 db 10,'-Mulitply or Divide Calculator-',10,0
lmsg1 equ $ - msg1
msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2
msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3
msg4 db '3. Multiply',10,0
lmsg4 equ $ - msg4
msg5 db '4. Divide',10,0
lmsg5 equ $ - msg5
msg6 db 'Operation: ',0
lmsg6 equ $ - msg6
msg7 db 10,'Result: ',0
lmsg7 equ $ - msg7
msg8 db 10,'Invalid Option',10,0
lmsg8 equ $ - msg8
nlinea db 10,10,0
lnlinea equ $ - nlinea
dw ?
; Spaces reserved for storing the values provided by the user.
opc BYTE ?
num1 byte ?
num2 byte ?
result word ?
_start:
; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg1
mov edx, lmsg1
int 80h
; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx,OFFSET msg2
mov edx, lmsg2
int 80h
; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, OFFSET num1
mov edx, 2
int 80h
; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg3
mov edx, lmsg3
int 80h
; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, OFFSET num2
mov edx, 2
int 80h
; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg4
mov edx, lmsg4
int 80h
; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg5
mov edx, lmsg5
int 80h
; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg6
mov edx, lmsg6
int 80h
; We get the option selected.
mov ebx,0
mov ecx, OFFSET opc
mov edx,2
mov eax,3
int 80h
mov ah, opc ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal
; We compare the value entered by the user to know what operation to perform.
cmp ah, 1
cmp ah, 2
cmp ah, 3
je multiply
cmp ah, 4
je divide
; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg8
mov edx, lmsg8
int 80h
main ENDP
; We keep the numbers in the registers al and bl
mov al, num1
mov bl, num2
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Print on screen the message 7
multiply PROC
; We store the numbers in registers al and bl
mov al, num1
mov bl, num2
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Multiply. AX = AL x BL
mul bl
; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov result, ax
; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg7
mov edx, lmsg7
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov result, ax
mov edx, 1
int 80h
; We end the program
multiply ENDP
divide PROC
; We store the numbers in registers ax and bx
mov al, num1
mov bl, num2
mov dx, 0
mov ah, 0
; Convert from ascii to decimall
sub al, '0'
sub bl, '0'
; Division. AL = AX / BX
div bl
; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov result, ax
; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, OFFSET msg7
mov edx, lmsg7
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, OFFSET result
mov edx, 1
int 80h
; We end the program
divide ENDP
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, OFFSET nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h
end
int80h
是一个Linux系统调用,在Windows上不起作用。你的朋友创建了一个特定于Linux的程序,即使你可以让它汇编并链接到可执行文件,它也不会在Windows上运行。如果你有irvine32.inc
,它就可以打印到显示器上并从键盘读取。您可以在此处找到有关使用Irvine库的信息:。教程中也有很多例子,可以作为程序的基础。哦,很高兴知道这不是我做的!谢谢你的资源。