|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面的例子是在给定字符串中查找某个字符,如果找到显示字符相对于字符串的首地址的偏移位置,如果未找到,就显示'N'。
但是我没看懂第22行“or dl,30”这行代码的意图,因为当查找位置大于10时,实际效果是字符转换。
data segment
string db 'THIS IS A STRING'
count equ $-string
data ends
assume cs:code,ds:data,es:data
code segment
start: mov ax,data
mov ds,ax
mov es,ax
lea di,offset string
mov al,'R'
mov cx,count
cld
repne scasb
jz found
mov dl,'N'
jmp display
found: dec di
mov dx,di
or dl,30h
display:mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start
本帖最后由 jackz007 于 2025-3-28 18:55 编辑 这一句的作用是把 dl 寄存器中的数字变成对应的文本字符以便利用 DOS 的 AH=02 功能在屏幕上进行显示。例如,dl = 00h,or dl , 30h 后,dl = 30h = '0',再例如,dl = 09h, or dl , 30h 后,dl = 39h = '9' ,这个操作会把数字 0、9 分别变成对应的字符 '0' 和 '9'。
但是,本例存在一个问题,那就是字符 'R' 的偏移为十进制 12,也就是说,dl 的值是 0ch,超出了十进制数字 9,是个十进制的两位数(12),就不可以直接 or dl , 30h 了,必须对相关的代码进行修改。 assume cs:code,ds:data,es:data
stack segment stack
db 400h dup(00)
stack ends
data segment
string db 'THIS IS A STRING'
count = $ - string
data ends
code segment
start: mov ax,data
mov ds,ax
mov es,ax
mov di,offset string ; 这里应该用 mov 指令
mov al,'R'
mov cx,count
cld
repne scasb
jz found
mov dl,'N'
jmp display
found: dec di
mov dx,di
cmp dx,0ah ; 判定偏移是否小于十进制 10
jb x01 ; 是则跳走
mov ax,dx ; 准备除法操作,被除数赋值
mov cl,0ah ; 准备除法操作,除数赋值
div cl ; ax 除以 0ah
mov dx,ax ; dl 是商,dh 是余数
add dl,30h ; 把商由数字变成对应的字符
mov ah,02h ; 调用 DOS 功能进行屏幕显示
int 21h ; 调用 DOS 功能进行屏幕显示
mov dl,dh ; 准备显示余数
x01: add dl,30h
display: mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start
|
|