计算机是进行数据处理,运算的机器,所以存在两个问题:
这两个问题,必须在机器指令中给出说明(有时候是明确的,有时候是隐式的),否者计算器就无法工作。
定义的描述性符号:
总结:
[...]
中进行内存寻址。[...]
中,他们可以单个出现,或者以组合形式出现(组合中不能有其他寄存器,但可以有idata)数据处理大致可分为三类:读取,写入,运算
指令执行前,所要处理的数据可以在3个地方:cpu内部,内存,端口
定位内存单元的方法,即称为寻址方式
前面将到分为隐式给出和显式给出,例如通过寄存器和push,pop等方法就是隐式给出。
加入不能够明确指定数据长度的化,就需要显式给出数据长度。显式给出数据长度的方法有ptr
指令,例如:
mov word ptr ds:[0], 1 mov byte ptr ds:[0],1 inc ... add ...
div指令为除法指令
被除数 / 除数 = 商......余数
有用到过db和dw,例如:
db 1 ;占1个字节 dw 1 ;占1个word(2个字节)
dd用来定义dword(double word,双子)。dd 1
则占用2个word(4个字节)。
dup是一个用于定义数据的操作符,由编译器识别。和db,dw,dd配合使用,用来进行数据的重复定义。
例如:
db 3 dup (0) db 3 dup(0,1,2) db 3 dup ('abc','ABC')
table段的dup实际定义了21*16个字节,空格也在对应的位置填上了。
assume ds:data, es:table, cs:code data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','1992' db '1993','1994','1995' ; 以上是表示 21 年的 21 个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ; 以上是表示 21 年公司总收入的 21 个 dword 型数据 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 ; 以上是表示 21 年公司雇员人数的 21 个 word 型数据 data ends ; 年份(4 字节) - 收入(4 字节) - 雇员数(2 字节) - 人均收入(2 字节) - ; table:0 '1975' 16 3 ? ; table:10H '1976' 22 7 ? ; ... ; table:140H '1995' 593700 17800 ? table segment db 21 dup ('year summ ne ?? ') ; 字符串占据 16 个字节 table ends code segment start: ; 初始化 data 和 table 指向 mov ax, data mov ds, ax mov ax, table mov es, ax ; 初始化偏移寄存器 mov bx, 0 ; 将用于年份和总收入的偏址 mov di, 0 ; 将用于雇员数的偏址 mov si, 0 ; 将用于 table 的偏址 mov cx, 21 ; 21年 s: ; 写入年份 mov ax, ds:0[bx] mov es:0[si], ax mov ax, ds:2[bx] mov es:2[si], ax mov al, 20h ; 添加空格 mov es:4[si], al ; 写入总收入 mov ax, ds:84[bx] ; ; 21 x 4 = 84 mov es:5[si], ax mov ax, ds:86[bx] mov es:7[si], ax mov al, 20h mov es:9[si], al ; 写入雇员数 mov ax, ds:168[di] ; 21 * 4 + 21 * 4 = 168 mov es:10[si], ax mov al, 20h mov es:12[si], al ; 人均收入 mov ax, ds:84[bx] mov dx, ds:86[bx] ; ; 被除数:总收入 mov bp, ds:168[di] ; 除数:雇员数 div bp ; 除法结果:商在 ax,余数在 dx mov es:13[si], ax mov al, 20h mov es:15[si], al ; 递增偏址变量 add bx,4 ; 年份和总收入 ;年份和总收入都是双字单元,故bx的递增量是4 add di,2 ; 雇员数, ;人数是字单元,故di的递增量是2 add si,16 ; table行 ;table中每行是16个字节,偏移量为16 loop s mov ax, 4c00H int 21H code ends end start