汇编程序中建立三个缓冲区的数据段设置问题?

Terryguy1991 2009-12-11 10:25:33
要从键盘输入三个字符串,先在程序数据定义部分定义三个缓冲区BUFFERA,BUFFERB,BUFFERC,
DATA SEGMENT
BUFFERA DB 32
DB 0
DB 32 DUP(0)
BUFFERB DB 81
DB 0
DB 81 DUP(0)
BUFFERC DB 32
DB 0
DB 32 DUP(0)

PROMPTSTRINGA DB 'input A string:',0AH,0DH,'$'
PROMPTSTRINGB DB 'input B string:',0AH,0DH,'$'
PROMPTSTRINGC DB 'input c string ',0AH,0DH,'$'
PROMPTSTRINGENTER DB 0AH,0DH,'$'
……
在字符串输入部分:
…………
MOV DX,OFFSET PROMPTSTRINGA
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERA
MOV DS,DX
MOV DX,OFFSET BUFFERA
MOV AH,0AH
INT 21H

MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV DX,OFFSET PROMPTSTRINGB
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERB
MOV ES,DX
MOV DX,OFFSET BUFFERB
MOV AH,0AH
INT 21H

MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV DX,OFFSET PROMPTSTRINGC
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERC
MOV **,DX ;这个**该填什么?
MOV DX,OFFSET BUFFERC
MOV AH,0AH
INT 21H

MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
前连个缓冲区的数据段分别设置为DS,ES,那该如何设置第三个缓冲区的数据段呢?
...全文
421 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
suchx 2009-12-13
  • 打赏
  • 举报
回复
错了是rep cmpsb
suchx 2009-12-13
  • 打赏
  • 举报
回复
我知道你的意思了,你想使用rep scasb指令吧,所以才要求有DS和ES段。但是DS=ES时程序也可以正确运行的啊
Terryguy1991 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nanlingcg 的回复:]
引用 7 楼 terryguy1991 的回复:
引用 5 楼 nanlingcg 的回复:
引用 4 楼 terryguy1991 的回复:
楼上的貌似不行,我试了一下,把数据段都设置成DS,但是原本可以的程序结果出错

为什么不可以啊?不是你把把几个变量定义在DS里,程序里的ES你保持不变吧?

这程序谁写的?不是你自己写的啊?

BUFFERB 用ES干什么呢?难道说几个输入的字符串还要经过处理后存在BUFFERB 里?另有用意?--不能排除这种可能性!

输入的三个字符串还要进行操作,目的是将B中的A(前提是B包含A)替换成c

我估计还是应该要进行操作,但我估计是操作后三个变量最后全部体现在B,实现输出,这样,只要把ES地址改成显存地址就可很直观很易看地实现(不过,用DS也可以一样,只是不那么浅显).
希望你能把这个程序完成!
[/Quote]
兄台的前面两句说对了,但是后面两句我不懂
suchx 2009-12-12
  • 打赏
  • 举报
回复
你全部放在一个段里就可以了,你的3个缓冲区也是全部定义在DATA SEGMENT里的
mov ax,data
mov ds,ax
mov es,ax
就好了啊
cnzdgs 2009-12-12
  • 打赏
  • 举报
回复
缓冲区都在同一个段中分配。
对于较大的缓冲区(几十KB以上)才需要另外分配内存,访问时给段寄存器赋值。
nanlingcg 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 terryguy1991 的回复:]
引用 5 楼 nanlingcg 的回复:
引用 4 楼 terryguy1991 的回复:
楼上的貌似不行,我试了一下,把数据段都设置成DS,但是原本可以的程序结果出错

为什么不可以啊?不是你把把几个变量定义在DS里,程序里的ES你保持不变吧?

这程序谁写的?不是你自己写的啊?

BUFFERB 用ES干什么呢?难道说几个输入的字符串还要经过处理后存在BUFFERB 里?另有用意?--不能排除这种可能性!

输入的三个字符串还要进行操作,目的是将B中的A(前提是B包含A)替换成c
[/Quote]
我估计还是应该要进行操作,但我估计是操作后三个变量最后全部体现在B,实现输出,这样,只要把ES地址改成显存地址就可很直观很易看地实现(不过,用DS也可以一样,只是不那么浅显).
希望你能把这个程序完成!
Terryguy1991 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nanlingcg 的回复:]
引用 4 楼 terryguy1991 的回复:
楼上的貌似不行,我试了一下,把数据段都设置成DS,但是原本可以的程序结果出错

为什么不可以啊?不是你把把几个变量定义在DS里,程序里的ES你保持不变吧?

这程序谁写的?不是你自己写的啊?

BUFFERB 用ES干什么呢?难道说几个输入的字符串还要经过处理后存在BUFFERB 里?另有用意?--不能排除这种可能性!
[/Quote]
输入的三个字符串还要进行操作,目的是将B中的A(前提是B包含A)替换成c
suchx 2009-12-12
  • 打赏
  • 举报
回复
DATA SEGMENT
BUFFERA DB 32
DB 0
DB 32 DUP(0)
BUFFERB DB 81
DB 0
DB 81 DUP(0)
BUFFERC DB 32
DB 0
DB 32 DUP(0)
PROMPTSTRINGA DB 'input A string:',0AH,0DH,'$'
PROMPTSTRINGB DB 'input B string:',0AH,0DH,'$'
PROMPTSTRINGC DB 'input c string ',0AH,0DH,'$'
PROMPTSTRINGENTER DB 0AH,0DH,'$'
data ends
code segment
assume ds:data,cs:code
start : nop
mov ax,data
mov ds,ax
剩下的程序
code ends
end start
你是指这样不行吗?你定义了code segment了吧,不会把程序和数据定义在一个段里了吧
nanlingcg 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 terryguy1991 的回复:]
楼上的貌似不行,我试了一下,把数据段都设置成DS,但是原本可以的程序结果出错
[/Quote]
为什么不可以啊?不是你把把几个变量定义在DS里,程序里的ES你保持不变吧?

这程序谁写的?不是你自己写的啊?

BUFFERB 用ES干什么呢?难道说几个输入的字符串还要经过处理后存在BUFFERB 里?另有用意?--不能排除这种可能性!
Terryguy1991 2009-12-12
  • 打赏
  • 举报
回复
楼上的貌似不行,我试了一下,把数据段都设置成DS,但是原本可以的程序结果出错
friendly_ 2009-12-11
  • 打赏
  • 举报
回复
都放在ds中就行了
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码的C语言代码 1.5 Linux内核源代码的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 断、异常和系统调用 3.1 X86 CPU对断的硬件支持 3.2 断向量表IDT的初始化 3.3 断请求队列的初始化 3.4 断的响应和服务 3.5 软断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构断机制 9.5SMP结构的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶) 10.3系统初始化(第二阶) 10.4系统初始化(第三阶) 10.5系统的关闭和重引导

21,497

社区成员

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

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