TASM指针位置对比
TASM pointer position comparison
我正在研究检查给定行是否为回文的程序的最后一段代码。但是,我有一件事需要帮助。
我有指针 si 和 di,指向该行的第一个和最后一个字符。我用它们来比较角色,然后继续。但是,我还需要比较指针本身的位置,所以我知道我需要在哪里停下来,因为我知道这条线是回文。
这是进行比较的代码段。
is_pol PROC near
mov si, offset currentline
mov di, offset currentline
add di, currentline_offset
comparesi:
cmp si, 'a'
jl notsmallsi
cmp si, 'z'
jg notsymbolsi
jmp comparedi
notsmallsi:
cmp si, 'A'
jl notlargesi
cmp si, 'Z'
jg notsymbolsi
jmp comparedi
notlargesi:
cmp si, '0'
jl notsymbolsi
cmp si, '9'
jg notsymbolsi
jmp comparedi
notsymbolsi:
inc si
jmp comparesi
comparedi:
cmp di, 'a'
jl notsmalldi
cmp di, 'z'
jg notsymboldi
jmp compare
notsmalldi:
cmp di, 'A'
jl notlargedi
cmp di, 'Z'
jg notsymboldi
jmp compare
notlargedi:
cmp di, '0'
jl notsymboldi
cmp di, '9'
jg notsymboldi
jmp compare
notsymboldi:
dec di
jmp comparedi
compare:
cmp si, di
jne no_palindrome
inc si
dec di
jmp is_palindrome
jmp comparesi
no_palindrome:
lea dx, not_palindrome
mov cx, 30
ret
is_palindrome:
lea dx, palindrome
mov cx, 30
ret
is_pol ENDP
缺少的代码部分是 "dec di" 和 "jmp is_palindrome"
之间的代码
感谢您的帮助。
SI
和DI
是指针。由于指针只是一个内存地址,因此它们包含 "the positions of the pointers themselves"。如果左开始递增指针的内存地址低于或等于右开始递减点的内存地址,则可以比较它们并打破循环,即 SI
<=DI
.
一个巨大的错误:要比较内存的值,您必须取消引用指针。目前您将指针与字符 (cmp si, 'a'
) 进行比较。使用括号取消引用 SI
或 DI
并添加大小规范:cmp byte ptr [si], 'a'
。
我正在研究检查给定行是否为回文的程序的最后一段代码。但是,我有一件事需要帮助。
我有指针 si 和 di,指向该行的第一个和最后一个字符。我用它们来比较角色,然后继续。但是,我还需要比较指针本身的位置,所以我知道我需要在哪里停下来,因为我知道这条线是回文。
这是进行比较的代码段。
is_pol PROC near
mov si, offset currentline
mov di, offset currentline
add di, currentline_offset
comparesi:
cmp si, 'a'
jl notsmallsi
cmp si, 'z'
jg notsymbolsi
jmp comparedi
notsmallsi:
cmp si, 'A'
jl notlargesi
cmp si, 'Z'
jg notsymbolsi
jmp comparedi
notlargesi:
cmp si, '0'
jl notsymbolsi
cmp si, '9'
jg notsymbolsi
jmp comparedi
notsymbolsi:
inc si
jmp comparesi
comparedi:
cmp di, 'a'
jl notsmalldi
cmp di, 'z'
jg notsymboldi
jmp compare
notsmalldi:
cmp di, 'A'
jl notlargedi
cmp di, 'Z'
jg notsymboldi
jmp compare
notlargedi:
cmp di, '0'
jl notsymboldi
cmp di, '9'
jg notsymboldi
jmp compare
notsymboldi:
dec di
jmp comparedi
compare:
cmp si, di
jne no_palindrome
inc si
dec di
jmp is_palindrome
jmp comparesi
no_palindrome:
lea dx, not_palindrome
mov cx, 30
ret
is_palindrome:
lea dx, palindrome
mov cx, 30
ret
is_pol ENDP
缺少的代码部分是 "dec di" 和 "jmp is_palindrome"
之间的代码感谢您的帮助。
SI
和DI
是指针。由于指针只是一个内存地址,因此它们包含 "the positions of the pointers themselves"。如果左开始递增指针的内存地址低于或等于右开始递减点的内存地址,则可以比较它们并打破循环,即 SI
<=DI
.
一个巨大的错误:要比较内存的值,您必须取消引用指针。目前您将指针与字符 (cmp si, 'a'
) 进行比较。使用括号取消引用 SI
或 DI
并添加大小规范:cmp byte ptr [si], 'a'
。