2017-01-15 4 views
-1

ファイル 'text.txt'には 's'のすべての数字を書かなければなりませんが、最後から最初の数字になります(87654321)。
私の質問は:mov si,len = 8、dec si = 7そしてなぜmov dl,byte ptr s+si-1が正しいですか? s+si-1は6(0 + 7-1)であり、これは「s」(リトルエンディアン)から5を意味します。「s」から8をどうですか?アセンブリで数えてください

assume cs:code, ds:data 
data segment 
    fileName db 'text.txt',0 
    s dw '12','34','56','78' 

    len equ $-s 
    s2 db len dup(?) 

    fileHandle dw ? 
    openErrorMsg db 'File can not be opened','$' 
    writeErrorMsg db 'An error occured when writing','$' 
data ends 
code segment 
start: 
    mov ax,data 
    mov ds,ax 
    ;open the file 
    openFile: 
     mov ah,3dh 
     mov al,1 
     mov dx,offset fileName 
     int 21h 
     jc openError 
     mov fileHandle,ax 

    mov cx,len 
    mov si,len 
    dec si 
    mov di,0 
    jcxz final 
    ;make the new array 
    formare: 
     mov dl,byte ptr s+si-1  ;HERE 
     mov s2[di],dl 
     inc di 
     mov dl,byte ptr s+si 
     mov s2[di],dl 
     inc di 
     sub si,2 
     dec cx 
     loop formare 

    ;write into the file 
    writeToFile: 
     mov al,0h 
     mov ah,40h 
     mov bx,fileHandle 
     mov cx,len 
     mov dx,offset s2 
     int 21h 
     jc writeError 
    jmp final 

    openError: 
     mov ah,09h 
     mov dx,offset openErrorMsg 
     int 21h 

    writeError: 
     mov ah,09h 
     mov dx,offset writeErrorMsg 
     int 21h 
    final: 
     mov ax, 4c00h 
     int 21h 
code ends 
end start 
+0

インデックスはゼロから始まります。 – Jester

+3

たぶん私は疲れているかもしれませんが、あなたの実際の質問を理解するのが非常に難しいと感じています。 –

答えて

0
s dw '12','34','56','78' 

EDIT:秒を待つ... NASMは文字列の定義が意味を行いますので、db '1', '2'のように、順序を "逆転" にこれらの100%必ずコンパイルされますどのようなアセンブラ。あなたは数字のような文字列をコンパイルするのであれば使用しますか?MASM?"が使用されている場合にのみ文字列としてコンパイルしますか?この臭い...デバッガのメモリ内容を確認してください。 。答えの下で私は仮定して動作します、そのdw '12' == dw 0x3132、しかし私は

addr | hexa byte 
------+----------- 
s+0 | 32 
s+1 | 31 
s+2 | 34 
s+3 | 33 
s+4 | 36 
s+5 | 35 
s+6 | 38 
s+7 | 37 

だから、 "S + 6" は確かに'8'を指すん:tは、テーブル内のアドレスと、バイト32 31 34 33 36 35 38 37にコンパイル


)私にはそう思えます。

おそらく、データがマシンコードにどのようにエンコードされているかを100%確信していなければ、デバッガのメモリ内容を確認することができます。

(私はデータの定義のみをチェックしましたが、あなたの質問に完全に回答しています)

関連する問題