Assembly 乘/除2.0

Assembly 乘/除2.0,assembly,masm,Assembly,Masm,我最近发布了一个我一直在使用的乘法-除法菜单(再次感谢大家的输入!),但我最近放弃了该代码,在一位有汇编语言经验的朋友的帮助下,我知道我现在有了一些我认为更接近最终产品的东西。但当我终于回到家把它组装起来时,我意识到他一直在向我展示一些他知道的NASM,这对MASM不太管用!我一直在一个接一个地尝试使用在线指南将任何不起作用的位转换为它们的MASM等价物。但现在我想我已经到了需要外界帮助的地步。我收到两个链接器错误LNK2001未解析的外部符号\u WinMainCRTStartup和LNK11

我最近发布了一个我一直在使用的乘法-除法菜单(再次感谢大家的输入!),但我最近放弃了该代码,在一位有汇编语言经验的朋友的帮助下,我知道我现在有了一些我认为更接近最终产品的东西。但当我终于回到家把它组装起来时,我意识到他一直在向我展示一些他知道的NASM,这对MASM不太管用!我一直在一个接一个地尝试使用在线指南将任何不起作用的位转换为它们的MASM等价物。但现在我想我已经到了需要外界帮助的地步。我收到两个链接器错误LNK2001未解析的外部符号\u WinMainCRTStartup和LNK1120 1未解析的外部

如果有人能帮我排除故障,或者如果其他人的系统可以运行,这看起来有效吗

   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库的信息:。教程中也有很多例子,可以作为程序的基础。哦,很高兴知道这不是我做的!谢谢你的资源。