Assembly 为什么我的汇编程序不工作?

Assembly 为什么我的汇编程序不工作?,assembly,nasm,masm,irvine32,Assembly,Nasm,Masm,Irvine32,我对汇编一无所知,现在我正在使用X86汇编。我正在使用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 "str

我对汇编一无所知,现在我正在使用X86汇编。我正在使用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
编译它时,会出现大量错误,其中大多数错误都是预期的解析器指令。我使用的是64位Windows 8,但没有理由不能运行32位程序-如果我错了,请纠正我。MASM编译器的问题是它需要我精确的Visual C++快线2005(精确地2005)来下载,否则它不会下载。我怎样才能使这个程序与我将来可能编写的其他程序一起工作呢?我确实记得把nasm汇编程序放入我的C编译器的bin文件中。就像我说的,我是个新手,信不信由你,这本书并没有告诉你如何运行这个程序。还有没有一种方法可以下载没有VS2005的masm(我似乎无论如何都找不到)或者该metter的任何VS

其他程序(在ASM中)似乎也不在其上运行。我很确定这是windows版本,否则它一开始就不会下载

为什么我的汇编程序不工作

因为您正试图用NASM以MASM语法编译汇编代码

选项1:获取MASM
不要试图将MASM代码放入NASM。
这不起作用,因为每个汇编程序都有自己的语法。
(是的,我同意这是一团糟)

根据@Frank的建议,从以下位置下载masm:
请注意,SDK(软件开发工具包)是编译代码所需的所有工具的实际工具。
masm
安装程序通过重新编译来重建开发工具。这有点不寻常,但它确实确保了编译代码所需的所有工具都存在并正常工作

选项2:使用NASM源代码示例
见:

选项3:了解MASM和NASM之间的区别
有一节介绍了与masm的区别:
这也可能有帮助:

选项4:获取自动翻译器
幸运的是,有自动转换器可以将MASM代码转换为NASM。
这里有一个:

请注意,这一特殊要求

使用以下代码:

; 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

如果您正在从一个汇编器(MASM)转移到一个完全不同的汇编器(NASM),那么不,它不应该“仍然工作”。汇编指令的语法是不同的。“预期指令”错误意味着它遇到的任何指令都不是有效的NASM指令。你需要转换。例如,在
nasm
中,通过
%include
指令包含文件,而不是
include
(注意百分号的存在)。你可以一步一步地检查每一个解析器错误,找出必须更改的指令,作为一个起点。@mbrach就像我说的,我实际上不知道任何程序集,我只是想在我开始用它编程之前把它全部安装好并运行起来。由于我想继续我的书,是否有任何我可以让NASM去做这个INCLUDE指令,或者是否有另一个我可以下载的汇编程序-我知道MASM,但是我不能下载,因为上面的原因你可以在这里查看:。我通过谷歌搜索“convert masm to nasm”找到了这一点。MASM可能只免费许可给那些已经拥有VS的人。问题不是你在使用Nasm,而是你在给它提供MASM代码。你可能想要的东西可以在那里找到,还有其他选择。。。但是初学者不需要任何“额外”的麻烦!使用Masm没有害处-事后洗手!:)@Kenny_007,Frank指给你的网站,包括所有MASM工具——ml、link、rc等。。。所以,是的,这是真正的“东西”。我已经使用“SDK”很多年了。