看了题目,瞄一眼代码,
SHR CX,1
JA L0
光这2条指令似乎不应该出现这种简单题目的思路上,
(还有 count equ $ - str 也错,应该是 count equ $ - buf)
即便加上手写答案,不管正确与否,合起来也挺别扭,看不出合理性.
眼看不如手动,直接把图中代码敲完好编译,这坨代码的结果是:
找寻位置必须在现有位置(34h,现在偏移值=05h)之前,结果才对,也就是34h放在0-5 都能找到,
超过则找不到, y 会 = 0ffh
比如
若把
buf db 2h,5h,9h,17h,22h,34h,60h 换成
buf db 2h,5h,9h,17h,22h,60h,34
就会找不到
34h放在原来位置或之前则可以
即使填充的不是现在这些,按题目要求,其实有比这更短少也更清晰的代码可参考.如下
data segment
; buf db 2h,5h,9h,17h,22h,34h,60h
buf db 2h,5h,9h,17h,22h,0AAh,60h,0cch,42h,54h,2h,5h,9h,17h,22h,034h,0bbh,0cch,42h,54h,2h,5h,9h,17h,22h,034h,60h,0cch,42h,54h
;资料改长一些
count equ $ - buf
x db 34h
y db ?
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov es,ax
mov al,x
mov bx,0ffh
cld;清除方向flag
mov cx,count
mov di,offset buf
repnz scasb ;以al重复扫瞄es:di字串 cx次,,每次cx-1,di+1,直至找到,或cx=0
jnz L2 ;找不到
lea bx,[di-1] ;取找到的位置
sub bx,offset buf ;减去原始位置=偏移
L2:
mov y,bl;存入偏移
mov ax,4c00h;返回dos
int 21h;调用dos
code ends
end start
SHR CX,1
JA L0
光这2条指令似乎不应该出现这种简单题目的思路上,
(还有 count equ $ - str 也错,应该是 count equ $ - buf)
即便加上手写答案,不管正确与否,合起来也挺别扭,看不出合理性.
眼看不如手动,直接把图中代码敲完好编译,这坨代码的结果是:
找寻位置必须在现有位置(34h,现在偏移值=05h)之前,结果才对,也就是34h放在0-5 都能找到,
超过则找不到, y 会 = 0ffh
比如
若把
buf db 2h,5h,9h,17h,22h,34h,60h 换成
buf db 2h,5h,9h,17h,22h,60h,34
就会找不到
34h放在原来位置或之前则可以
即使填充的不是现在这些,按题目要求,其实有比这更短少也更清晰的代码可参考.如下
data segment
; buf db 2h,5h,9h,17h,22h,34h,60h
buf db 2h,5h,9h,17h,22h,0AAh,60h,0cch,42h,54h,2h,5h,9h,17h,22h,034h,0bbh,0cch,42h,54h,2h,5h,9h,17h,22h,034h,60h,0cch,42h,54h
;资料改长一些
count equ $ - buf
x db 34h
y db ?
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov es,ax
mov al,x
mov bx,0ffh
cld;清除方向flag
mov cx,count
mov di,offset buf
repnz scasb ;以al重复扫瞄es:di字串 cx次,,每次cx-1,di+1,直至找到,或cx=0
jnz L2 ;找不到
lea bx,[di-1] ;取找到的位置
sub bx,offset buf ;减去原始位置=偏移
L2:
mov y,bl;存入偏移
mov ax,4c00h;返回dos
int 21h;调用dos
code ends
end start