[英]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.