我最近发布了一个关于我一直在努力的多重分割菜单,(再次感谢所有人的投入!),但我最近废弃了该代码,并且在具有汇编语言经验的朋友的帮助下,我知道在工作中我现在有一些我认为更接近最终产品的东西。但是当我终于回到家里把它放在一起时,我意识到他一直在展示我知道哪些与NASM不相符的NASM!我一直在尝试将任何不起作用的位转换为使用在线指南的MASM等效错误。但现在我觉得我已经达到了可以使用一些外界帮助的程度。我得到一些链接器错误LNK2001未解析的外部symbol_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