dw最多定义多少个字??

小兵比克 2012-01-11 10:24:10
如题,是不是最多就是一个数据段的大小?如果想定义更多怎么办??
...全文
238 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小兵比克 2012-01-12
  • 打赏
  • 举报
回复
其实我在做一个题,题是这样的

data segment
dw ?
data ends
end
要求:
只在定义的数据段'?'中加入相关的内容,使得上面的程序可以在屏幕中间显示一个绿色的字符'A'。
这可能实现吗?显存地址是0b8000了,我想在data段中定义好多无关的数据,一直把这个数据的长度拖到显存地址
hili210 2012-01-12
  • 打赏
  • 举报
回复


dw 'AB' , 'CD' , 'EF' , 0 ; 0为结束表示,使用DOS中断时结束标志位'$'

小兵比克 2012-01-12
  • 打赏
  • 举报
回复
不知道是不是我没有理解题的意思,那题的意思是:只在dw后写东西,别处不许写。我理解的是这样,所以觉得这题挺刁钻的
hili210 2012-01-12
  • 打赏
  • 举报
回复



给楼主做了一个简单的,比较好理解,写了一堆注释:





; 在中间显示以0结尾的字符串

assume cs:code


data segment

db 'welcome to masm!' , 0 ;存放要输出的字符串

data ends



stack segment

db 16 dup (0)

stack ends



code segment

start: mov ax , data ; 设置数据段
mov ds , ax
mov bx, 0

mov ax , stack ; 设置栈段
mov ss , ax
mov sp , 16

mov ax , 0b872h ; 设置要写入的数据位置
mov es , ax ; 写入位置
mov di , 0
mov si , 16 ; 要读取的颜色位置


mov ax , 02H ; 写入颜色,绿色


mov ch , 0
s1: mov cl , ds:[bx] ; 拿出要写入的字符
jcxz ok ; 如果是0,就输出完毕
mov es:[di] , cl ; 把字符写入
mov es:[di + 1] , al ; 写入要颜色
inc bx ; 移动到下一个字符
add di , 2 ; 移动到下一个要写入的位置
loop s1


ok:

mov ax , 4c00h
int 21h

code ends

end start



hili210 2012-01-12
  • 打赏
  • 举报
回复


下面是我学汇编时做的几个例子。


这是第一个例子,楼主可以向Data段写入数据,最后记得写个0即可,0表示结束标记




; 显示以0结束的字符串

assume cs:code

data segment

db 'Dangerous' , 0

data ends


stack segment

db 16 dup(0)

stack ends


code segment

start:
;设置栈
mov ax , stack
mov ss , ax
mov sp , 16


;设置参数
mov dh , 15 ;第16行
mov dl , 32 ;第33列
mov cl , 8ch ;红色+闪烁


;设置要读取的数据位置
mov ax , data
mov ds , ax
mov si , 0


call show_str

mov ax , 4c00h
int 21h


;子程序
;功能:在指定的位置 , 用指定的颜色 , 显示一个用0结束的字符串
;参数:(dh) = 行号(取值范围0~24) , (dl) = 列号(取值范围0~79)
; (cl) = 颜色 , ds:si指向字符串首地址
show_str:

mov ax , 000ah ;转换成行需要乘以a(10)
mul dh ;计算写入位置的行
add ax , 0b800h ;B800是起始位置,所以加上规定的行数


add dl , dl ;计算写入位置的列
mov dh , 0


mov es , ax ;设置写入位置的寄存器
mov di , dx

mov al , cl ;保存颜色


mov cx , 2
jmp first_start
again:

mov cl , ds:[si] ;获取要显示的数据
mov ch , 0 ;不需要高位
jcxz ok ;如果是0则返回(结束这个子程序)

mov es:[di] , cl ;将字符写入
mov es:[di + 1] , al ;写入颜色
add di , 2 ;指向下一个要写入的位置
inc si ;指向下一个要读取字符的位置
mov cl , 2 ;again循环每次都成立
first_start:
loop again
ok: ret ;返回(结束)这个子程序



code ends

end start







另一个是调用DOS中断:




; 分别在屏幕上的第2、4、6、8行显示下面的4句英文诗

assume cs:code


code segment

s1: db 'Good,better,best,' , '$'
s2: db 'Never let it rest.' , '$'
s3: db 'Till good is better,' , '$'
s4: db 'And better,bets.' , '$'
s: dw offset s1 , offset s2 , offset s3 , offset s4
row: db 2 , 4 , 6 , 8


start: mov ax , cs
mov ds , ax
mov bx , offset s
mov si , offset row
mov cx , 4
ok: mov bh , 0
mov dh , [ si ]
mov dl , 0
mov ah , 2
int 10h

mov dx , [ bx ]
mov ah , 9
int 21h
inc si
add bx , 2
loop ok


mov ax , 4c00h
int 21h


code ends


end start



小兵比克 2012-01-12
  • 打赏
  • 举报
回复
晕,还是没有人理解啊
hili210 2012-01-11
  • 打赏
  • 举报
回复
如果不用mov 来设置地址寄存器的话,我刚刚做了下程序,用MASM5.0 编译,用Debug调试没问题。

另类的方法还有很多,用我们老师的话就是极限编程



assume cs:code


code segment


XOR AX , AX
OR AX , 1000000000B ; 十六进制为0200H

PUSH AX
POP DS ; DS指向0200H位置


MOV AX , 4C00H
INT 21H


code ends


end




POP完毕后,楼主可以在Debug中用 -d ds:0 查看一下当前指向的地址
hili210 2012-01-11
  • 打赏
  • 举报
回复

刚测试了下用:

PUSH AX
POP DS

之类的方法也可以改变



至于最多可以定义多少个,楼主可以自己编程试试,最简单的利用 dw 1024 dup(?)
来改变1024这个重复的次数的量可以试试看。
赵自行 2012-01-11
  • 打赏
  • 举报
回复
理论上是不能的
小兵比克 2012-01-11
  • 打赏
  • 举报
回复
从指定的地址去定义数据段,但是不能用mov ax,.... mov ds,ax的方式
小兵比克 2012-01-11
  • 打赏
  • 举报
回复
或者说,该如何从一个指定的地址去定义一个数据段[Quote=引用 1 楼 masmaster 的回复:]

理论上,段的大小16位汇编是64KB,32位汇编是4GB。应该是这样吧。
[/Quote]
小兵比克 2012-01-11
  • 打赏
  • 举报
回复
好像是的,怎么能定义更多呢
masmaster 2012-01-11
  • 打赏
  • 举报
回复
理论上,段的大小16位汇编是64KB,32位汇编是4GB。应该是这样吧。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧