鱼C论坛

 找回密码
 立即注册
查看: 69|回复: 2

[已解决]本例中or dl ,30h的意图

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
               
最佳答案
3 天前
本帖最后由 jackz007 于 2025-3-28 18:55 编辑
                or dl,30h
         这一句的作用是把 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-3-28 18:55 编辑
                or dl,30h
         这一句的作用是把 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
这是网上一篇教学字符串处理汇编指令文章中的例题,不明白作者怎么没考虑偏移大于9的情况,还一位or dl,30h有其他意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-3-31 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表