[英]Why is my assembly program not working?
我对Assembly完全陌生,现在我正在使用X86 Assembly。 我正在使用NASM,现在我的代码尚未编译。 我是从书中获得的,基本上,代码可用于字符串:
; This program demonstrates the string-handling procedures in
; the book's link library.
INCLUDE Irvine32.inc
.data
string_1 BYTE "abcde////",0
string_2 BYTE "ABCDE",0
msg0 BYTE "string_1 in upper case: ",0
msg1 BYTE "string1 and string2 are equal",0
msg2 BYTE "string_1 is less than string_2",0
msg3 BYTE "string_2 is less than string_1",0
msg4 BYTE "Length of string_2 is ",0
msg5 BYTE "string_1 after trimming: ",0
.code
main PROC
call trim_string
call upper_case
call compare_strings
call print_length
exit
main ENDP
trim_string PROC
; Remove trailing characters from string_1.
INVOKE Str_trim, ADDR string_1, '/'
mov edx,OFFSET msg5
call WriteString
mov edx,OFFSET string_1
call WriteString
call Crlf
ret
trim_string ENDP
upper_case PROC
; Convert string_1 to upper case.
mov edx,OFFSET msg0
call WriteString
INVOKE Str_ucase, ADDR string_1
mov edx,OFFSET string_1
call WriteString
call Crlf
ret
upper_case ENDP
compare_strings PROC
; Compare string_1 to string_2.
INVOKE Str_compare, ADDR string_1, ADDR string_2
.IF ZERO?
mov edx,OFFSET msg1
.ELSEIF CARRY?
mov edx,OFFSET msg2 ; string 1 is less than...
.ELSE
mov edx,OFFSET msg3 ; string 2 is less than...
.ENDIF
call WriteString
call Crlf
ret
compare_strings ENDP
print_length PROC
; Display the length of string_2.
mov edx,OFFSET msg4
call WriteString
INVOKE Str_length, ADDR string_2
call WriteDec
call Crlf
ret
print_leng
th ENDP
END main
就像我说的那样,我正在使用NASM,所以这可能是问题所在,但它仍然可以正常工作,但是当我使用nasm -f win32 other.asm -o other.o
对其进行编译时,会出现很多错误,其中大多数是解析器错误预期的指示。 我使用的是Windows 8 64位,但是没有理由为什么它不能运行32位程序-如果我输入错误,请纠正我。 MASM编译器的问题在于,它说我恰好需要Visual C ++ Express 2005(准确地说是2005)才能下载,否则就不会下载。 我如何使该程序与将来可能要编写的其他程序一起使用,我确实记得将nasm汇编器放入C编译器的bin文件中。 就像我说的那样,我很新,不管信不信,这本书都没有真正告诉您如何运行程序。 也有一种方法可以下载没有VS 2005(无论如何我似乎都找不到)或任何适用于该流量计的VS的Masm
其他程序(在ASM中)似乎也不在其上运行。 我很确定这是Windows版本,否则一开始就不会下载。
为什么我的汇编程序不起作用?
因为您正在尝试使用NASM以MASM语法编译汇编代码。
选项1:获取MASM
不要尝试将MASM代码放入NASM。
这将不起作用,因为每个汇编程序都有自己的语法。
(是的,我同意这很糟) 。
按照@Frank的建议,从以下位置下载masm: http : //www.masm32.com/masmdl.htm
请注意,SDK(软件开发工具包)是编译代码所需的所有工具的真实内容。
masm
安装程序通过重新编译来重建开发工具。 这有点不寻常,但是它可以确保编译代码所需的所有工具都可以使用。
选项2:使用NASM源代码示例
请参阅: https : //www.google.co.za/search?q=sample+nasm+programs&ie=utf-8&oe=utf-8&rls=org.mozilla : nl : official&client=firefox-a&gws_rd=cr&ei=uPNgUp-wBIqihgf45oDwCQ
选项3:了解MASM和NASM之间的区别
nasm
手册中有一节介绍了与masm
的区别: http : //www.nasm.us/doc/nasmdoc2.html#section-2.2
这可能也有帮助: http : //left404.com/2011/01/04/converting-x86-assembly-from-masm-to-nasm-3/
选项4:获取自动翻译器
幸运的是,有一些自动翻译器可以将MASM代码转换为NASM。
这是一个: http : //www.devoresoftware.com/nomyso/
请注意,这一特定功能需要perl 。
使用以下代码:
; String Library Demo (StringDemo.asm)
; This program demonstrates the string-handling procedures in
; the book's link library.
INCLUDE Irvine32.inc
.data
string_1 BYTE "abcde////",0
string_2 BYTE "ABCDE",0
msg0 BYTE "string_1 in upper case: ",0
msg1 BYTE "string1 and string2 are equal",0
msg2 BYTE "string_1 is less than string_2",0
msg3 BYTE "string_2 is less than string_1",0
msg4 BYTE "Length of string_2 is ",0
msg5 BYTE "string_1 after trimming: ",0
.code
main PROC
call trim_string
call upper_case
call compare_strings
call print_length
exit
main ENDP
trim_string PROC
; Remove trailing characters from string_1.
INVOKE Str_trim, ADDR string_1,'/'
mov edx,OFFSET msg5
call WriteString
mov edx,OFFSET string_1
call WriteString
call Crlf
ret
trim_string ENDP
upper_case PROC
; Convert string_1 to upper case.
mov edx,OFFSET msg0
call WriteString
INVOKE Str_ucase, ADDR string_1
mov edx,OFFSET string_1
call WriteString
call Crlf
ret
upper_case ENDP
compare_strings PROC
; Compare string_1 to string_2.
INVOKE Str_compare, ADDR string_1, ADDR string_2
.IF ZERO?
mov edx,OFFSET msg1
.ELSEIF CARRY?
mov edx,OFFSET msg2 ; string 1 is less than...
.ELSE
mov edx,OFFSET msg3 ; string 2 is less than...
.ENDIF
call WriteString
call Crlf
ret
compare_strings ENDP
print_length PROC
; Display the length of string_2.
mov edx,OFFSET msg4
call WriteString
INVOKE Str_length, ADDR string_2
call WriteDec
call Crlf
ret
print_length ENDP
END main
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.