我正在爲我的考試學習,而且我對這個彙編代碼感到困惑。這是一個程序,第一個用戶輸入一個字符串,而不是該字符串被編碼和打印,而不是解碼和打印。簡單編碼/解碼字符串混淆的彙編代碼?
令我困惑的是(德)編碼部分。因此,使用MyString的「LEA bx,MyString」內存地址保存在寄存器bx中。現在編碼發生。這樣做的目的是什麼?
INC bx
MOV cl, [bx]
XOR ch, ch
coding:
INC bx
MOV dl, [bx]
XOR dl, ah
MOV [bx], dl
LOOP coding
爲什麼增加內存地址?這不是改變地址嗎?爲什麼要在循環中再次增加bx。這些指針只是混淆了我。我得到地址bx中的字符被移動到dl而不是用掩碼編碼的部分,而不是放回到dl。我對內存地址的增加感到困惑。這是否意味着它首先從第三個角色開始?比代碼字符串的3個字符與掩碼?前兩個比起來怎麼樣?對不起,如果問題很蠢,謝謝!
下面是完整的代碼:
.MODEL small
.DATA
STR_LENGTH EQU 30
BUFF_LENGTH EQU STR_LENGTH + 3
MyString DB BUFF_LENGTH DUP (0)
Coder_Mask DB 128
.STACK
.CODE
NewLine MACRO
MOV dl, 10
MOV ah, 02h
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h
ENDM
DeCode MACRO bx, ah
LOCAL coding
INC bx
MOV cl, [bx]
XOR ch, ch
coding:
INC bx
MOV dl, [bx]
XOR dl, ah
MOV [bx], dl
LOOP coding
ENDM
WriteString MACRO bx
LOCAL writing
INC bx
MOV cl, [bx]
XOR ch, ch
writing:
INC bx
MOV dl, [bx]
MOV ah, 02h
INT 21h
LOOP writing
ENDM
Start:
MOV ax, @DATA
MOV ds, ax
LEA bx, MyString
MOV cl, BUFF_LENGTH
MOV [bx], cl
LEA dx, MyString
MOV ah, 0Ah
INT 21h
NewLine
LEA bx, MyString
WriteString bx
LEA bx, MyString
MOV ah, Coder_Mask
DeCode bx, ah
NewLine
LEA bx, MyString
WriteString bx
NewLine
LEA bx, MyString
MOV ah, Coder_Mask
DeCode bx, ah
NewLine
LEA bx, MyString
WriteString bx
MOV ax, 4C00h
INT 21h
END Start
順便說一句,像這樣存儲字符串是很不尋常的,這很明顯,爲什麼在這種情況下使用這個結構(因爲字符串的輸入是通過'int 21h'的0A函數完成的),但這不是一般的藍圖,在ASM中實現字符串。實際上C/C++使用零終止的字符串(沒有任何長度的字節),並且一些DOS的int 21h函數用於打印字符串,使用''''終止的字符串(不含長度),而BIOS中斷函數通常需要字符串的長度作爲參數。 – Ped7g
非常感謝。 – Shallan
@Shallan我加了「如何」推理。嘗試與你的其他例子考試,它應該有所幫助。 :) – Ped7g