网站的详细设计,高级网站开发技术,沈阳男科正规医院有哪些,做哪种网站浏览量比较高目录0 前言0.1 先告诉你结论1 8086汇编语言中的字符串1.1 字符串的定义与使用1.2 直接定义的细节1.2.1 使用DB数据类型1.2.2 使用其他数据类型1.3 直接使用的细节1.3.1 赋值给寄存器1.3.2 赋值给内存单元1.3.3 字符串直接使用的本质1.4 应用2 扩展#xff1a;数据定义的方式3 …
目录0 前言0.1 先告诉你结论1 8086汇编语言中的字符串1.1 字符串的定义与使用1.2 直接定义的细节1.2.1 使用DB数据类型1.2.2 使用其他数据类型1.3 直接使用的细节1.3.1 赋值给寄存器1.3.2 赋值给内存单元1.3.3 字符串直接使用的本质1.4 应用2 扩展数据定义的方式3 附录题目和回顾0 前言
本文使用emu8086软件进行8086汇编语言编辑和运行。
顺便说一句汇编语言源程序中的数字默认是十进制因此使用十六进制的数字的时候必须有h或H后缀本文也都遵循这样的原则。
至于为什么默认十进制我只能说编译器默认你是个人不要笑事实如此如果默认你是机器那么数字就默认十六进制了。
0.1 先告诉你结论
在8086汇编语言中定义字节类型的数据比如
字符字符串字节数值数组
都用DB进行定义表示其后的数据都是字节型数据并且按照顺序依次存储。
举例说明
db a
db abcdefghijk ; 相当于 db a,b,c,d……
db 0,1,2,3,4,5,6,71 8086汇编语言中的字符串
通常情况下汇编语言中的字符串都会被赋予DB字节数据类型那么为什么这样做
不能使用DW数据类型吗
当然可以但是不建议使用。
1.1 字符串的定义与使用
定义后使用可以在任何位置这样定义不过建议在数据段内定义然后再通过一些方式访问并使用它们
data1 db hello
data2 db world直接使用可以在指令中作为立即数直接使用
mov ax,ab1.2 直接定义的细节
1.2.1 使用DB数据类型
使用DB作为数据类型的时候字符串长度不受限制默认字符串的每一个字符占一个字节并且存储过程中是按照一个字符占一个字节的方式顺序依次存储的。
源程序如下
assume ds:data
data segmentdata1 db abcchsadhkjhsfaksaskhasfdata ends对应的内存单元原来是这样的
0710:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0710:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0710:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................放入代码段数据之后是
0710:0000 61 62 63 63 68 73 61 64-68 6B 6A 68 73 66 61 6B abcchsadhkjhsfak
0710:0010 73 61 73 6B 68 61 73 66-00 00 00 00 00 00 00 00 saskhasf........
0710:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................这里data1的值将会被编译为这串字符串的首地址对应的偏移地址也就是0000此时data1并不能够代表字符串的全部字符你可以把它理解为data1 db a也就是第一个字符a是字节型数据它的标号是data1但是它后面的字符是没有标号的。
这也就意味着mov ax,data1会报错因为data1是字节型数据而mov al,data1会得到al 61H。
将字符串规定为字节类型是常用的其他的了解即可基本不会用到下面简单介绍。
1.2.2 使用其他数据类型
例如使用dw数据类型则最多存储2个字节。
data1 dw ab 也就是说如果不是db类型的字符串则存储字符的数量是与数据类型相关联的例如dw abc就是错误的因为超越了2个字节。
对于其他数据类型dd、dq等也是一样的不过这些并不常用。
1.3 直接使用的细节
对于8086CPU来说
寄存器最大16位也就是2个字节比如ax或者也可以是8位比如al可以操作的内存单元也是如此最大是word ptr ds:[address]16位或者byte ptr ds:[address]8位
如果你想说32位或者更多那是间接完成也需要通过16位辅助来完成我们这里说的是一步到位直接使用。
这也就意味着我们使用的字符串只能使用a或者ab这里的字母代表任何ASCII字符在ASCII码中一个字符占1个字节所以我们只有这两种选择并且要注意数据类型的匹配比如mov al,ab就是非法的mov ax,abcd也是非法的。
我来列举一些常见情况至于其他情况都是其衍生品罢了。
1.3.1 赋值给寄存器
汇编语言程序为
mov al,a
mov ax,a
mov ax,ab对于以上3条编译后的结果是
mov al,061h
mov ax,00061h
mov ax,06162h执行后的结果是
al 61h
ax 0061h
ax 6162h1.3.2 赋值给内存单元
这里假设ds 1000h
汇编语言程序为注意要加上数字h目的是为了美观
mov byte ptr ds:[0],a
mov word ptr ds:[10h],a
mov word ptr ds:[20h],ab编译后的结果为
mov byte ptr [10000],061h
mov word ptr [10010],00061h
mov word ptr [10020],06162h执行前内存为
1000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................执行后内存为
1000:0000 61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 a...............
1000:0010 61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 a...............
1000:0020 62 61 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ba..............思考你是不是发现了什么规律是不是对于某些地方也感到困惑思考一下然后再往下看 1.3.3 字符串直接使用的本质
就一句话将字符按照ASCII码规则转换为数字这个数字可以理解为立即数其余的事情就是立即数相关问题了。
你可能看见了当mov word ptr ds:[20h],ab之后内存中是ba而不是ab我想你知道原因了这与在数据段定义不同那里是顺序的这里是倒序的原因在于在数据段用db数据类型存储是一个一个字符存储的而这里是作为一个字来存储的是一个整体。
1.4 应用
思考题 如果你有以下数据段的定义
assume ds:data
data segmentdata1 db doxdata ends现在你需要将dox修改为DOX应该如何做如果要修改为VEX又该怎么做
提示
第一个问题可以转换为小写字母变成大写字母的问题第二个问题就是内存修改问题 你可以使用mov ax,V的方式直接替换也可以先定义好data2 db VEX数据再进行替换
2 扩展数据定义的方式
为了避免内容冗杂我单独写了一篇文章链接在此
我希望你知道的是学会了字符串的定义也就学会了各种数据的定义因为字符串定义的本质就是数字定义只需要按照编码规则换成数字就行了。
3 附录题目和回顾
来自于《汇编语言》王爽第七章此处只是为了记录读者可不看。 ; 全变成大写字母并且将外循环次数暂存到内存中
assume ds:data
data segmentdata1 db abc gg data2 db hello hq cycleCount dw ?data endsassume ss:stack
stack segmentcycle dw ? stack endsassume cs:code
code segment
start:mov ax,datamov ds,axmov ax,stackmov ss,ax ; 下面两条语句不能二合一因为汇编程序追求的是格式的统一与极简mov sp,offset cycle ; 不要使用 Magic Numbersub sp,2mov bx,0 ; 外层 控制行mov cx,2s0:;mov cycleCount,cx;push cycle ; 注意此处不是推入偏移地址这个数据push offset cycle而是直接推入数据; 【数据传送】指令; 【错误】推的是cx不是cyclepush cx mov si,0 ; 内层 控制列mov cx,8s1: ; 字传送不浪费mov ax,[bx][si] ; 为什么没有造成不匹配报错 【按照地址找数据类型是自动匹配的】; 【自动匹配】【强制匹配】and ax,0DFDFHmov [bx][si],axadd si,2loop s1add bx,16;mov cx,cycleCountpop cxloop s0mov ax,4c00hint 21h
code ends
end start