我试图访问一个数组,每次迭代我都将元素的值存储在寄存器AL中。我访问的数组是一个从用户那里获取值的数组,我输入的值是(12134)。
问题是,当我试图在过程中访问数组的每个元素并将其存储在寄存器AL中时,错误的值被存储为(31),这是第一个元素,第二个元素被存储为(32)在AL中。我试图知道这个值背后的原因,但无法弄清楚。提前感谢。
注意:我提供了第一次迭代时寄存器的屏幕截图,以便沿着代码进一步说明
;read and access array
DIM EQU 5
.MODEL small
.STACK
.DATA
arr DB DIM DUP(?)
.CODE
.STARTUP
MOV BX, OFFSET arr ;Storing the address of arr to bx
CALL READ ; Calling the read procedure to input data into arr
MOV BX, OFFSET arr ;Storing the address of arr to bx
CALL arr_acc ;Calling the procedure that should access each element of the array and store each element
;in AL with every iteration
.EXIT
; PROCEDURES
; Read PROC
MOV DI, 0
MOV AH, 1 ; set AH for reading
lab1: INT 21H ; read a character
MOV BX[DI], AL ; store the character
INC DI ; go to next element
CMP DI, DIM ; compare array index with 0
JNE lab1 ; jump if not equal
RET
Read ENDP
arr_acc PROC
MOV AX,0
MOV DI,0
lop: CMP DI,DIM ; checking if the DI reached the maximum index DIM
JE EXIT_LOP ;exit the lop which will exit the procedure as well
MOV AL, BX[DI] ; Moving the first element in AL
INC DI ; increment DI to get to the next element
JMP lop ; jump back to the loop
EXIT_LOP:
RET
arr_acc ENDP
END
字符串
enter image description here
enter image description here的
尝试:
1.我试着用SI寄存器代替DI寄存器
1.只使用BX并将其递增1,因为它是一个字节数组
1条答案
按热度按时间j2cgzkjk1#
我从用户那里得到了它的值,我输入的值是(12134)。存储的错误值是(31),这是第一个元素,第二个元素在AL中存储为(32)
想一想你的问题的读者在这里要处理什么!你括号里的数字(12134,31和32)看起来都像普通的十进制数,但只有专业读者才能看穿这一点,并理解31和32将是从调试器屏幕上获得的十六进制数字。请善待读者,并将这些写为31h和32h。或者使用0x31和0x32。
为什么会有问题
DOS.GetCharacter函数01 h以字符代码(ASCII)响应。对于键0到9,您将获得范围为48到57的ASCII代码。在使用输入之前,您应该将字符代码转换为所涉及数字的标称值。转换简单地减去48,我们通常将其写为
sub al, '0'
。