1

私はアセンブリが初めてで、現在は 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 大量のエラーが発生し、そのほとんどはパーサー命令が必要であると言います。Windows 8 64 ビットを使用していますが、32 ビット プログラムを実行できない理由はありません。間違っている場合は訂正してください。MASM コンパイラの問題は、ダウンロードするには正確に Visual C++ Express 2005 (正確には 2005) が必要であると表示され、それ以外の場合はダウンロードされないことです。このプログラムを、将来作成する可能性のある他のプログラムと一緒に動作させるにはどうすればよいですか? また、nasm アセンブラーを C コンパイラーの bin ファイルに入れることを忘れていませんでした。私が言ったように、私はかなり初心者で、信じようと信じまいと、この本は実際にプログラムの実行方法を教えてはくれません。また、VS 2005(とにかく見つけられないようです)またはそのメーターのVSなしでmasmをダウンロードする方法はありますか

他のプログラム (ASM 内) も実行されていないようです。これはWindowsバージョンであると確信しています。そうでなければ、そもそもダウンロードされませんでした。

4

2 に答える 2

2

アセンブリ プログラムが機能しないのはなぜですか?

NASM を使用して MASM 構文でアセンブラー コードをコンパイルしようとしているからです。

オプション 1: MASM を取得
する MASM コードを NASM に入れようとしないでください。
すべてのアセンブラには独自の構文があるため、これは機能しません。
(はい、私はそれがめちゃくちゃであることを認めます) .

@Frank の提案に従って、masm をhttp://www.masm32.com/masmdl.htm
からダウンロードします。SDK (ソフトウェア開発キット) は、コードのコンパイルに必要なすべてのツールを備えた実際のものであることに注意してください。インストーラーは、開発ツールを再コンパイルして再構築します
masmこれはやや珍しいことですが、コードをコンパイルするために必要なすべてのツールが存在し、機能していることを保証します。

オプション 2: NASM ソース コードの例
使用するa&gws_rd=cr&ei=uPNgUp-wBIqihgf45oDwCQ

オプション 3: MASM とNASM
nasm違いを学ぶマニュアルには、違いに関するセクションが ありますmasm: http://www.nasm.us/doc/nasmdoc2.html#section-2.2 .com/2011/01/04/converting-x86-assembly-from-masm-to-nasm-3/

オプション 4: 自動翻訳機を入手する
幸運なことに、MASM コードを NASM に変換する自動翻訳機があります。http://www.devoresoftware.com/nomyso/ この特定のものには perl が必要であることに注意し
ください

于 2013-10-18T08:50:57.453 に答える
0

次のコードを使用します。

; 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
于 2016-05-06T01:01:43.527 に答える