本文已参与「新人创作礼」活动,一起开启掘金创作之路。
tips
(1).一个或多个常数或表达式;当为多个常数或表达式时,期间要用逗号隔开;如DATA1--DATA4;
(2).带单引号的字符串;
对于字节型(DB)变量,每个变量的大小为1个字节,每个变量的值不能超过1个字符,每个字节内存入一个字符的ASCII码值,整个字符串可以在同一对单引号内给出,这相当于是定义了一个字符数组,如DATA5;
对于字类型(DW)变量,每个变量的大小为2个字节,每个变量的值不能超过2个字符,若为2个字符时,同样遵循高位存入高字节,低位存入低字节的规则;若为1个字符,则该字符的ASCII码值存入到低字节,高字节为00,如DATA6;
对于双字类型(DD)变量,每个变量的大小为4个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到双字变量的最低2个字节中,1个字符的值被存入到双字变量的最低1个字节中;
对于长字类型(DQ)变量,每个变量的大小为8个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到长字变量的最低2个字节中,1个字符的值被存入到长字变量的最低1个字节中;
(3).一个问号"?",表示该变量的值不确定,即:该变量所表示的内存单元中的内容是不确定的,或者说是,当表达式为问号时,变量所对应的内存区中并没有存入新的值,而只是预留出了相应的存储空间;如DATA7、DATA8
(4).重复方式;此时的格式为: 重复次数 DUP(表达式);重复方式指出表达式的值可以重复地存储到变量对应的内存区中,重复的次数由伪指令给出,相当于定义数组;如DATA9、DATA10
定义变量的例子:
DATA1 DB 20H ;1字节变量
DATA2 DW 0204H,1000H ;2字节变量
DATA3 DB (-1*3),(15/3) ;1字节变量
DATA4 DD 123456H ;4字节变量
DATA5 DB '0123' ;字符串变量,相当于一个字符数组
DATA6 DW 'AB','C','D' ;字符串变量,相当于一个字符串数组;
DATA7 DB ? ;1字节变量,未初始化
DATA8 DD ? ;4字节变量,未初始化
DATA9 DB 5 DUP(0) ;1字节变量,用5个0初始化,相当于是一个具有5个DB型元素的数组
DATA10 DW 3 DUP(?) ;2字节变量,未初始化,相当于是一个具有3个DW型元素的数组
记录一次报错
Error : division overflow
I don't know what is the exact definition of overflow in the division. can you explain it first and then instruct it by the below example?
for example my book has written that this piece of code results to overflow. I don't know why??
mov dx,0087h
mov ax,6002h
mov bx,10h
div bx
but this piece of code is correct and doesn't result to overflow:
mov dx,0087h
mov ax,6000h
mov bx,100h
div bx
Q:so why the first result into overflow but second not what is the difference?
A:The dividend in registers DX and AX is in fact a 32bit number, in your example it is 00876002h.
It will be divided by the divisor BX and the result (quotient) should fit in register AX. The remainder after unsigned division will be put into register DX.
When you try to divide 00876002h by the contents of BX (10h), the result is 87600h and remainder is 2. Now you should see why it triggers an error: quotient 87600h is too big to fit into 16bit register AX.
Divide overflow (alias division by zero) happens when the divisor is too small. Your example will overflow when BX is below DX.
实验7
数据段不够用时引进扩展段es
assume cs:code,ds:data,es:table,ss:stack
stack segment
db 0
stack ends
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 ;收入
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 ;雇员数
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ( 'year summ ne ?? ')
table ends
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
mov bx,0 ;数据段中起始年份偏移
mov si,84 ;收入偏移
mov di,168 ;雇员数偏移
s: push cx
mov ax,ds:[bx] ;年份填入
mov dx,ds:[bx+2]
mov es:[0],ax
mov es:[2],dx
mov ax,ds:[si] ;收入填入
mov dx,ds:[si+2]
mov es:[5],ax
mov es:[7],dx
mov ax,ds:[di] ;雇员数
mov es:[10],ax
mov ax,ds:[si] ;32位除法
mov dx,ds:[si+2]
mov cx,ds:[di]
div cx
mov es:[13],ax ;人均收入填入
add bx,4 ;偏移至下一次
add si,4
add di,2
mov ax,es
add ax,1
mov es,ax
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
甲鱼老师的做法
这边用idata索引第一个年收入的段基
bx作为年收入偏移
同理