簡體   English   中英

英特爾 8086 程序集反轉字符串的順序

[英]Intel 8086 assembly reversing order of string

所以我在英特爾 8086 程序集中編寫代碼,我想輸入兩個字符串(一行中的一個字符串)並希望將它們保存到變量中。 每個字符串最多可以包含 100 個 utf8 字符。 在 output 中,我嘗試更改 then 的順序(第一行將是輸入中的第二個字符串),但我收到一個錯誤,即服務 21h 正在嘗試從未定義的字節中讀取。 你能向我解釋一下我應該在我的代碼中改變什么嗎?

cpu 8086
segment code
..start mov ax, data
        mov ds, ax
        mov bx,stack
        mov ss,bx
        mov sp,dno


input1  mov ah,0x0a
        mov dx, load
        int 21h
        mov bl,[load+1]
        mov [chars1+bx],byte '$'

input2  mov ah,0x0a
        mov dx, load
        int 21h
        mov bl,[load+1]
        mov [chars2+bx],byte '$'

output  mov dx,chars2
        mov ah,9
        int 21h

        mov dx,chars1
        mov ah,9
        int 21h

 end    hlt

 segment data
 load   db 200, ?
 chars1     db ?
 resb 100

 chars2 db ?
 resb 100

 segment    stack
 resb 100
 dno:    db ?

但我收到一個錯誤,即服務 21h 正在嘗試從未定義的字節中讀取。 你能向我解釋一下我應該在我的代碼中改變什么嗎?

您沒有加載 DOS.BufferedInput function 0Ah 所需的輸入結構的地址。 緩沖輸入的工作原理中閱讀所有相關信息。

Emu8086 遵循 MASM 編程風格,其中mov dx, load將設置DX寄存器等於存儲在地址load處的字。 要實際接收地址本身,您需要編寫mov dx, offset load

另一個問題是input1input2都試圖使用相同的加載輸入結構,但具有不同的緩沖存儲器。 緩沖區必須是此 DOS function 的輸入結構的一部分; 它始終必須位於所提供地址的偏移量 2 處(在您的情況下為load )。

這是您可以解決的方法:

 ...

input1: mov ah, 0Ah
        mov dx, OFFSET loadA
        int 21h
        mov bl, [loadA+1]
        mov bh, 0
        mov [charsA+bx], byte '$'

input2: mov ah, 0Ah
        mov dx, OFFSET loadB
        int 21h
        mov bl, [loadB+1]
        mov bh, 0
        mov [charsB+bx], byte '$'

output: mov dx, OFFSET charsB
        mov ah, 09h
        int 21h

        mov dx, OFFSET crlf
        mov ah, 09h
        int 21h

        mov dx, OFFSET charsA
        mov ah, 09h
        int 21h

 ...

loadA   db  101, 0
charsA  db  101 dup (0)
loadB   db  101, 0
charsB  db  101 dup (0)
crlf    db  13, 10, "$"
 ...
  • 101 為 100 個字符和 1 個終止回車提供空間。
  • 不要相信太多不是您自己設置的寄存器! 在使用整個BX之前寫一個明確的mov bh, 0
  • 由於您希望將這些字符串輸出到不同的行,因此我添加了代碼以移至下一行的開頭。 crlf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM