请前辈解释一下这段程序
程序来自零基础学汇编第32课 要求用汇编转换字母大小写 关于这段程序实在有许多看不多的地方 希望有前辈能给解释一下 不胜感激assume cs:codesg,ds:datasg
datasg segment
db 'BiSiC'
db 'iNforMaTion'
datasg ends
//问一: 关于这里我想问的是db 这个字符串 这两个字符串的数据是存放放在detasg中吗 为什么我在debug查
codesg segment 到的是076a 是什么情况
start:mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:and al,11011111b // 问二 循环5次 是怎么办到的 我自己用debug调试过了 但是还不不明白原理 请一步一步说下原理好吗 还有
mov,al 关于11011111b这个数据是为什呢 如果是每五个字母的十六进制 换算出来也不对啊 大写的a是从65开始的
inc bx
loop s
5
mov bx,5
mov cx,11
s0:mov al,
or al,00100000b //这里也是同理 为什么是要设置这个数
mov ,al
inc bx
loop s0
mov ax,4c00h //问三 最后这两个代码的意义或者说是作用是什么 百度是解释不清楚 希望能通俗简单的说一下
int 21h
codesg ends
end start
本帖最后由 ryxcaixia 于 2015-8-10 09:08 编辑
少年~问题一个一个来
问一: 关于这里我想问的是db 这个字符串 这两个字符串的数据是存放放在detasg中吗 为什么我在debug查
答:db的这个字符串肯定是在datasg里, 直接ds:0或者ss:0即可
问二 a>循环5次 是怎么办到的 我自己用debug调试过了 但是还不不明白原理 请一步一步说下原理好吗
答:循环是由cx + loop 控制
循环的次数是由cx决定
mov cx, 5即是让cx循环5次
每loop一次, 除了跳到标记位置, 对应的cx默认减一
loop s 即相当于 des cx, jnz s 即只要cx不为0 就跳到s位置
当cx减少到0 既然跳出循环
b>关于11011111b这个数据是为什呢 如果是每五个字母的十六进制 换算出来也不对啊 大写的a是从65开始的
or al,00100000b //这里也是同理 为什么是要设置这个数
这两个放在一起回答
首先, 大小写字母之间有个固定的差值, 比如'A' 'a'之间差值为32 同理到Z z, 所以大小写转换就是加减32
而对于小写字母来说 他们的32数值的那一位 必然为1 即红色那一位 这样按位与相当于减32,小写变大写
同理 or al,00100000b 相当于加32 大写变小写
and al,11011111b
问三 最后这两个代码的意义或者说是作用是什么 百度是解释不清
mov ax,4c00h
int 21h
一句话 简单理解为c语言中的return 0; 即可
ps:三师公好帅 回答问题一:用DEBUG查内看内存的话看到的是对应的ASCII码,如十六进制6A对应的是小写字母i ;
回答问题二:循环五次是同错设置CX==5,结合loop 语句实现的,循环11次也是这个道理。
回答转换问题:在ASCII码中,大写字母A 从41H开始,小写字母a从61H开始。如把A转换成a ,即01000001变成01100001,可以看出只要正数第三位变成1,其余不变即可,所以小写变大写的时候,可以用AND,and11011111b 的作用就是把第三位变成0,其余位不变,这样就可以完成转换;同理大写变小的写的时候用OR,or00100000b ,是第三位变成1,其余位不变。这主要是用了大小写字母ASCII的对应关系得到的算法。 我也不知道 qishi 564655 1111111111
646456 少年,你的问题有点多,我觉得你应该把前面的知识巩固以下不要跳着读书,这样不是系统的学习方法.
问题一:
db字符串确实存放在datasg中,但是内存中字符是以ASII码存放的,就像a的ASCII码就是97D十六进制便是61H
你要看d命令右边那列才有字符.datasg的段地址是用t命令执行第一句的mov ax,?. ?就是 datasg的段地址.
问题二:
cpu执行命令是按顺序执行的,但是loop是跳转指令.它会改变cpu执行命令的顺序
cpu执行loop指令时的操作:(cx) = (cx) - 1 (cx)=0? 若(cx)=0 执行下一句 ,否则cpu跳转至标号处执行
这样实现循环的.loop就是跳转指令.
按照这种机制 cx中存放的数刚好是循环次数 关于为什么要设置那些数字,这个与位运算有关.(我用C语言的符号讲述)
|(或 就是or命令)
1|0 = 1 , 0|1 = 1,0|0 = 0,1 | 1 = 1
有一个结论 1|op = 1 0|op = op (op为操作数=1或0)
&(和 and命令)
同理
0&op = 0;1&op = op
操作数与1111...进行或运算,操作数各个位,置1
进行与运算,操作数不变
操作数与000...进行或运算,操作数不变
进行与运算,操作数变成000.. 小写 = 大写 + 32; 把左数第6位置1即可 相当于 +32
大写 = 小写 - 32;把左数第6位置0即可 相当于 -32
问题3
内个是程序返回
在dos单任务系统中cmd.exe(命令行)把cpu的控制权交给你的程序,你的程序运行完成应该把cpu的控制权交还给cmd.exe,这叫做返回,内个就是返回代码
int是中断的意思,即让cpu暂停而返回cmd.exe
单任务系统不可能既执行cmd.exe又执行你的程序
我是来看看的,学习学习。。。。。。 感觉这个很好哦。。。
回答问题一:用DEBUG查内看内存的话看到的是对应的ASCII码,如十六进制6A对应的是小写字母i ;
回答问题二:循环五次是同错设置CX==5,结合loop 语句实现的,循环11次也是这个道理。
回答转换问题:在ASCII码中,大写字母A 从41H开始,小写字母a从61H开始。如把A转换成a ,即01000001变成01100001,可以看出只要正数第三位变成1,其余不变即可,所以小写变大写的时候,可以用AND,and11011111b 的作用就是把第三位变成0,其余位不变,这样就可以完成转换;同理大写变小的写的时候用OR,or00100000b ,是第三位变成1,其余位不变。这主要是用了大小写字母ASCII的对应关系得到的算法。 {:5_91:} 都没有第三个问题的回答,那就我来回答吧。
首先: 少年 你的基础好不扎实,你得好好的逛逛论坛{:5_91:}
现在进入正题: mov ax,4c00h
mov 21h
这是一个正确让你返回的代码,话说从哪里来回哪里去,你把人给带来了,你还得自己领回去,因为这是汇编,所以好多的事得自己做。
第一句话是设置参数,al代表一个参数,ah代表一个参数,为接下来的21h号中断提供数据支持,为了方便赋值,也可直接写成 mov ax,4c00h
第二句话就是触发int21号中断喽,内中断可以在代码中触发也可以在行为中触发,有好多人都默认为中断只能编译器自动触发,触发中断的方式是有多种的,给你打个比方,你想脸红,可以通过发绕生病,还可以让别人打你一耳光,这样都可以实现脸红。所以编译器是认识这个中断代码的,所以正确执行返回中断内的代码,你现在还没有学到中断,所以没必要细究它,后面你都可以改变中断程序,实现解决突发状况的应急措施。
我个人认为你有极强的好奇心,对于汇编这个东西,你能够好学,只要踏踏实实学习,个人祝你更上一层楼。 答一:
db这个字符串是伪指令,功能:定义字节变量;;
编译器读取源文件编译时用到,db告诉编译器每个变量元素占一个字节;;
这个字符串在源文件中经过编译连接后在exe文件中没有具体值存在,
也就是说debug并不将db加载如内存中。是没有放在detasg中。
关于076a这个值,是代码段CS(codesg)的值,与db字符串无关。
答二:
循环5次是,mov cx,5执行完后,cx=5
然后执行s:标号后的指令,....一直到“loop s”指令这个地方,可以理解为循环执行了第一次;
loop指令执行作用:第一步(cx=cx-1=4;;;第二步(判断当前cx寄存器是否为0,不为零则转到s:标号出执行;执行第二次循环;;
再次到loop指令出,cx=cx-1=3,不为零,转到s标号出,执行第三次循环;;
再次到loop指令出,cx=cx-1=2,不为零,转到s标号出,执行第四次循环;;
再次到loop指令出,cx=cx-1=1,不为零,转到s标号出,执行第五次循环;;
再次到loop指令出,cx=cx-1=0,为零,不转到s标号出,执行下面指令“mov bx,5”
问:“loop s”指令后的 5 是搞错了吧。
关于11011111b这个数据:
‘A’=65d(十进制)
=41h(十六进制)
=0100 0001b(二进制)
‘a’=97d(十进制)
=61h(十六进制)
=0110 0001b(二进制)
比较二进制数不同的数位
and al,11011111b ;按位与将0那个地方,逻辑与为0,就只能是大写了;;
答三:
mov ax,4c00h
int 21h ;调用21h号终端,DOS功能调用,
21h号中断程序有几个常用功能,通过AH寄存器中的值不同功能不同。
ah=1,键盘输入一个字符,保存在AL寄存器
ah=2,显示一个字符,该字符在DL寄存器
ah=9,显示字符串,地址在ds:dx
ah=10,输入字符串,地址在ds:dx
ah=4ch,返回调用该程序的程序,你是debug调用的该程序,所以返回debug 第一个表示没见过
loop cx是循环
第三个个是进行或操作(不知道改成16进制还行吗?一会试试)
最后的代码是中断
我是看小甲鱼的视频学的看到第五章了
在这里谢谢小甲鱼了 刚查了一下
AND and是与运算
or是或运算
刚才不知怎的就发出去了
页:
[1]
2