簡體   English   中英

TASM,程序集,無法更改字符串,偏移量

[英]TASM, Assembly, can't change string, offset

我嘗試將字符串更改為另一個字符串,但我得到的 output 已損壞。

如何將字符串更改為另一個字符串,這樣它就不會這樣做:

在此處輸入圖像描述

預期 output:

in rect
under line
out circ

另外,我不知道代碼中“偏移”的目的,所以它也可能是問題所在。

此外,我在嘗試組裝它時收到一些警告,但我不知道它們的意思:

在此處輸入圖像描述

編碼:

.model small

.data
X    db 0
Y    db 0
var0 db 0

rect        db "out rect",13,10,"$"
rect_plus   db "in rect",13,10,"$"
line        db "under line",13,10,"$"
line_plus   db "above line",13,10,"$"
circ        db "out circ",13,10,"$"
circ_plus   db "in circ",13,10,"$"

.code
main:
    mov ax, @data
    mov ds, ax

    jmp input

    input:
        ...        
        jmp rect_check1

    rect_check1:
        ...        
        jb  rect_check2
        jmp rect_print
    
    rect_check2:
        ...
        jb rect_change
        jmp rect_print
    
    rect_change:
        lea bx, rect;               <============== SOMETHING WRONG HERE
        mov [bx], offset rect_plus; <=========================== OR HERE
    
        jmp rect_print

    rect_print:
        mov dx, offset rect;        <=========================== OR HERE
        mov ah, 09h
        int 21h
    
        jmp line_check
    
    line_check:
        ...
        jb  line_change
        jmp line_print

    line_change:
        lea bx, line;               <=========================== OR HERE
        mov [bx], offset line_plus; <=========================== OR HERE
    
        jmp line_print

    line_print:
        mov dx, offset line;        <=========================== OR HERE
        mov ah, 09h
        int 21h
    
        jmp circ_check
    
    circ_check:
        ...        
        jb  circ_change
        jmp circ_print

    circ_change:
        lea bx, circ;               <=========================== OR HERE
        mov [bx], offset circ_plus; <=========================== OR HERE

        jmp circ_print

    circ_print:
        mov dx, offset circ;        <=========================== OR HERE
        mov ah, 09h
        int 21h

        jmp quit

    quit:
        mov ax, 4c00h
        int 21h
end main
  rect_change:
        lea bx, rect;               <============== SOMETHING WRONG HERE
        mov [bx], offset rect_plus; <=========================== OR HERE
        jmp rect_print

你的邏輯在這里是錯誤的。 lea bx, rect將字符串"out rect",13,10,"$"的偏移量加載到寄存器bx中。 然后bx中的偏移量為0003h 下一條指令嘗試用另一個字符串"in rect",13,10,"$" (二進制數000Eh )的偏移量覆蓋ds:bx處 memory 的一個或兩個字節(字母“o”或“ou”)這沒有任何意義。 由於您沒有指定要覆蓋的字節數,因此 TASM 會向您發出警告。

例如,重組你的意大利面條代碼並使你的子過程可調用(以ret結尾)

line_print PROC ; Display the $-terminated string addressed with DS:DX.
        mov ah, 09h
        int 21h
        ret
line_print ENDP

然后,每當您想顯示一個字符串時,將其偏移量加載到dx並調用子過程:

    mov dx,offset rect
    call line_print
    ; check the rectangle
    mov dx,offset rect_plus
    call line_print
   

暫無
暫無

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

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