|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
|
|