2017-01-15 60 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),這意味着數字5從's'(在little-endien中)。如何從'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' 

編輯:等一下... NASM將編譯這些100%肯定的 「逆轉」 命令,像db '1', '2',所以串定義纔有意義是什麼彙編。你是否使用,如果它真的像數值編譯?MASM?它只會在使用"時纔會將它編譯爲字符串?請檢查調試器中的內存內容,以避免一些令人討厭的驚喜。在下面的答案中,我假設,dw '12' == dw 0x3132,但我Ť似乎不太可能對我來說)


表編譯成字節32 31 34 33 36 35 38 37,具有地址:

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'

如果您不能100%確定數據是如何編碼爲機器碼的,那麼在調試器中檢查內存內容可能會對您有所幫助。

(我沒有檢查你的代碼的其餘部分,只有數據的定義,這是IMO完全回答你的問題?)