精华内容
下载资源
问答
  • 数据段定义如下数据: data segment  db 68h, 10h, 0A7h, 00h, 8Bh, 01h, 70h, 00h  db 16h, 00h, 0A7h, 03h, 8Bh, 01h, 70h, 00h  db 8Bh, 01h, 70h, 00h,0CCh, 06h, 10h, 02h  db 53h
     
    

    在数据段中定义如下数据:
    data segment
            db 68h, 10h, 0A7h, 00h, 8Bh, 01h, 70h, 00h
            db 16h, 00h, 0A7h, 03h, 8Bh, 01h, 70h, 00h
            db 8Bh, 01h, 70h,  00h,0CCh, 06h, 10h, 02h
            db 53h, 07h, 010h, 02h,0FFh, 03h, 10h, 02h
            db 59h, 07h, 10h,  02h, 0Ah, 04h, 10h, 02h
            db 3Ah, 00h, 0A7h, 03h, 54h, 00h,0A7h, 03h
            db 6Eh, 00h, 0A7h, 03h, 88h, 00h,0A7h, 03h
            db 0A2h,00h, 0A7h, 03h,0FFh, 03h, 10h, 02h

     db 0,0,0,0,0,0,0,0
    data ends

      编写一个程序统计数据段中定义的前8行数据中每行字节数据为0的个数。统计后,将个数填充在第9行对应的位置。 在程序中需要需要编写一个子程序,该子程序定义如下:

        子程序定义:
     名称:count
     功能:统计一段内存中字节数据为某个标准值的个数
     参数:ds:si指向数据起始位置
           cx是需要统计的字节数
           al为标准值
     返回值:dx 返回字节数据为0的个数

    assume cs:code ,ds:data
    data segment
            db 68h, 10h, 0A7h, 00h, 8Bh, 01h, 70h, 00h
            db 16h, 00h, 0A7h, 03h, 8Bh, 01h, 70h, 00h
            db 8Bh, 01h, 70h,  00h,0CCh, 06h, 10h, 02h
            db 53h, 07h, 010h, 02h,0FFh, 03h, 10h, 02h
            db 59h, 07h, 10h,  02h, 0Ah, 04h, 10h, 02h
            db 3Ah, 00h, 0A7h, 03h, 54h, 00h,0A7h, 03h
            db 6Eh, 00h, 0A7h, 03h, 88h, 00h,0A7h, 03h
            db 0A2h,00h, 0A7h, 03h,0FFh, 03h, 10h, 02h

     db 0,0,0,0,0,0,0,0
    data ends
    code segment
    start:mov ax,data
            mov ds,ax
     mov si,0
     mov di,0
     mov cx,8
        s0:call count
         
          mov byte ptr ds:[di+64],dx
         inc di
         mov dx,0
          loop s0

     mov ah,4ch
     int 21h
    ; 子程序定义:
    ; 名称:count
    ; 功能:统计一段内存中字节数据为某个标准值的个数
    ; 参数:ds:si指向数据起始位置
    ;       cx是需要统计的字节数
    ;       al为标准值
    ; 返回值:dx 返回字节数据为0的个数
    count:
              push cx
       push ax

              mov dx,0
               mov cx,8
          s:  mov al,ds:[si]
               mov ah,0
        cmp ax,0 ;比较为0 跳转
        je ok
        dec cx
        inc si
              
              jcxz   ok2
        jmp  short  s
        
      ok:inc dx
         dec cx
         inc si
         jcxz ok2
        jmp  short  s  

        
    ok2:pop ax
          pop cx
          
           ret    
    code ends
    end start

     

    展开全文
  • 汇编语言数据段查找ASCII码并回显

    千次阅读 2017-08-29 20:25:58
    实验要求:在数据段预先存放16个十六进制的ASCII码,首地址ASC。从键盘输入位十六进制数到BX,用ASC[BX](寄存器相对寻址)寻址方式找到对应数位的ASCII码,并取出显示。...数据段定义 data end

    实验要求:在数据段预先存放16个十六进制的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX](寄存器相对寻址)寻址方式找到对应数位的ASCII码,并取出显示。

    汇编代码片段:

    data segment
     asc db '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' 
    ;数据段定义
    data ends
    code segment
     assume cs:code,ds:data
    start:
    mov ax,data
    mov ds,ax
    mov ah,1h
    int 21h 
    ;此行和上一行调用DOS 1h号功能:键盘输入并回显,输入的值进入al
    mov bl,al 
    ;将al的值赋给bl
    mov bh,0 
    ;由于下面要与40h比较而cmp必须是高精度比较
    cmp bx,40h
    ;由于A的ascii码是40h,小于则是数字,大于等于则是字母
    jns xxxxxx;(这里大家自己自定义名称)
    ;alp为alpha即字母SF=0未产生标志位则说明bx比A大是字母跳转到alp
    js num;否则跳转到num
    num:sub bx,30h;bx为数字
        jmp over
    xxxxxx:sub bx,37h;减去37h则为数字
        jmp over
    over:mov cl,asc[bx];cl的值是对应数位的ascii码
         mov dl,cl
         mov ah,2;调用DOS 2h号回显功能,注意回显功能只能显示dl
         int 21h
        mov ah,4ch
        int 21h;结束
    code ends
    end start

    实验结果在MASM FOR WINDOWS显示

    输入数字5,返回数字5

    实验截图请访问我的网站:omegaxyz.com

    展开全文
  • 汇编之

    2020-10-07 11:40:50
    这是典型的定义数据段和附加段的汇编语句。 data segment data ends 是一对成对使用的伪指令,也是写汇编程序时必须要用到的一对伪指令。 因为个有意义的汇编程序中至少要有个段。 segment和ends的作用是定义一...


    段的基本概念

    段的起始地址一定是16的倍数。
    段的大小一定是16的倍数
    一个段的最大长度是64KB

    段中定义一些数据

    在这里插入图片描述
    dest_buffer和source_buffer就是名字,代表了这段空间的首地址。
    (?)表示初始值随便。

    都放在一个段是什么样?分几个段是什么样?

    段实际占用的空间大小

    王爽老师汇编语言P135
    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?
    段的实际占用空间
    也就是说,段的大小一定是16的倍数,但你也可以在段里定义不是16的倍数的m个字节,这种情况下段里就有剩下的空白的段单元。因为存储器是以字节来组织的,也可以说有些字节大小的内存单元空在那了,没有存放东西。
    所以你也可以在段里定义17个字节,31个字节,但是系统分配空间是16个16个的分配,所以这两种情况你段的大小都是32。
    在这里插入图片描述
    这两句汇编明显是在数据段里定义了40个字节型数据,并且值全部是a,source_buffer代表这段数据空间的首地址。
    40个字节型数据,显然占40个字节。(这话说起来很傻,但是要明白40个字型数据占的就是80个字节了)
    但是如果问你数据段的大小是多少?答案是3*16=48

    到这里我们也能看出来,汇编中一个段的大小和这个段里面定义的数据息息相关!一个段有N个字节,那么该段实际占有空间为16*(N/16 + 1)个字节。同样如果这个段里面没有定义数据,那么系统不会给这个段分配空间!
    在这里插入图片描述
    如果汇编这样写,那这两句话就是纯粹的废话。因为段里没有定义数据,你这个段相当于没定义。

    段的地址(段在内存中的位置)

    在这里插入图片描述
    data就是一个标号,是这个段的名称,这个段的名称最终将被编译,连接程序处理为一个段的段地址(P79)
    简单的说:
    段名就相当于一个标号,它代表了段地址。
    并且
    段的地址,也就是data的值,是系统自动分配的!不是人为设置的。
    实际上这种分配是按着定义的顺序来的。参见王爽老师《汇编语言》P134练习题,很明显data段,stack段,code段是按照定义的顺序在内存中顺序分布的。
    关于段的一篇特别好的博文
    汇编中的分段和段地址的定位
    在这里插入图片描述
    在这里插入图片描述

    程序运行前,ds,es这些都还没被赋值呢,运行之后,系统会给数据段分配一个地址,给附加段分配一个地址,然后执行到
    mov ax,data
    mov ds,ax
    这些语句时,ds,es也会被赋上值,之后再做汇编操作(比如串传送)就可以用ds,es等了。

    段的在程序中的应用

    在这里插入图片描述
    这是典型的定义数据段和附加段的汇编语句。
    data segment
    data ends
    是一对成对使用的伪指令,也是写汇编程序时必须要用到的一对伪指令。
    因为一个有意义的汇编程序中至少要有一个段。
    segment和ends的作用是定义一个段,segment说明一个段开始,ends说明一个段结束。

    因为我们定义了段,所以要在前面加上assume ds:data
    代码段中也要有
    mov ax,data
    mov ds,ax

    展开全文
  • 题目:在数据段中有从STRING单元开始存放的100个字节数据,编写程序要求将字符串中的大写字母转换小写字母,并显示到... 数据段定义 STRING DB 100 DB ? BUF DB 100 DUP(?) CNT EQU $-BUF DATA ENDS CODE SEG

    题目:在数据段中有从STRING单元开始存放的100个字节数据,编写程序要求将字符串中的大写字母转换为小写字母,并显示到屏幕上。

    汇编源程序如下:

    DATA   SEGMENT                  ; 数据段定义
    	STRING	DB	100
    		DB	?
    	BUF	DB	100 DUP(?)
    	CNT	EQU	$-BUF
    DATA    ENDS
    CODE    SEGMENT                 ; 代码段定义
       ASSUME CS:CODE,DS:DATA
    START: 
         	MOV	AX,DATA
         	MOV	DS,AX            ;设置DS
         	
         	LEA	DX,STRING
    	MOV	AH,10
    	INT	21H		;从键盘接收字符串
    
    	PUSH	DX
    	PUSH	AX
    	MOV	DL,0DH
    	MOV	AH,2
    	INT	21H
    	MOV	DL,0AH
    	MOV	AH,2
    	INT	21H
    	POP	AX
    	POP	DX		;回车换行
    
    	MOV	CH,CNT		;总的字符个数
    	MOV	SI,OFFSET BUF
    
    NEXT:
    	MOV	CL,[SI]
    	CMP	CL,41H
    	JB	NEXT2
    	CMP	CL,5AH
    	JA	NEXT2	;判断是否是大写
    
    	ADD	CL,20H	;把大写字母改为小写字母
    NEXT2:	
    	MOV	DL,CL
    	MOV	AH,2
    	INT	21H	;输出字符
    	MOV	DL,20H
    	MOV	AH,2
    	INT	21H	;输出空格
    
    	
    	INC	SI
    	DEC	CH
    	JNZ	NEXT
    	
    	
      	MOV  	AH,4CH
    	INT	21H
    CODE    ENDS
    	END     START
    


    运行情况:该程序运行后,无显示,如下图所示。

    查错经过:

        仔细阅读一下代码,发现,这段代码里,有一处关于获取实际输入字符串个数的用法(第28行)有问题。

        根据10号DOS功能调用的用法,从键盘实际输入的字符的个数应该保存在STRING+1单元,所以,这条指令应该改为MOV  CH,STRING+1。

        将修改后的程序汇编、连接后运行,结果正确,如下图所示。


        尽管修改了一条指令后,程序可以正确运行了,但是,笔者的疑问依然存在。刚刚修改的一条指令,仅仅是关于循环次数的。为什么,循环次数比实际字符个数多的时候,无法正确显示结果呢?DEBUG.EXE是调试汇编程序的重要工具。为了解决这个问题,必须要借助DEBUG。

        在命令窗口,执行DEBUG yxj.exe命令,调试该程序。下图所示,是调试窗口的情况。


        进入DEBUG后,设置一个断点。这个断点应该设置在键盘输入DOS功能调用之后,结果输出之前。本次调试,笔者设置的断点是cs:000e处的指令。程序运行到断点处,停下来后,笔者利用D DS:0命令,查看了一下输入字符缓冲区。此次输入的字符串是Aa123,在输入缓冲区看到,在实际输入的字符串后面,10号调用执行后,自动在输入字符的后面插入字符串结束符0DH。现在谜底找到了。无法正常运行的程序,由于多输出了实际输入字符后面的全部输入缓冲区的内容,这其中包括0DH(这个符号是回车符)。这样,当输出到回车符时,光标回到显示行的最左边,将之前输出的内容全部覆盖了。因此,看到的现象是没有输出。

       为了验证,笔者的判断是否正确。在DEBUG里,笔者临时修改了保存0DH值的单元的内容(用 E DS:7命令)。运行结果(见上图),正确。


    心得:

        汇编学习是一个需要耐心和恒心的过程。只有通过不断的上机练习,才能给真正掌握这门程序设计语言。本例提示我们,运行时发生的错误,应该从多个方面去查找问题,不应该孤立的查找错误。例如,本例出错的根本原因是字符串的个数弄错了,而运行后的表现却是没有显示。

        这种错误的发生,是比较难查找的。

    
    

    展开全文
  • 子程序设计实验

    2013-05-10 10:33:50
    ;从键盘输入位十进制数,定义一个子程序将其以二进制形式输出到屏幕 .386 DATA SEGMENT USE16 ;定义数据段,数据段名称为DATA MSR DB "PLEASE INPUT DATA:$" DATA ENDS
  • DATA SEGMENT ;定义数据段 MESS DB 'File Handle Error!',07,13,10,'$' FN1 DB 'myprog.txt',00H ;myprog.txt放在工作目录下 FH1 DW ? BUFF DB 20 DUP(0) DATA ENDS SSEG SEGMENT STACK ;定义栈段 DB 2...
  • 汇编helloworld程序

    2015-11-06 16:22:42
    data segment;...定义个字符串,记得要以$结束标志 data ends ;数据段结束 code segment ;代码段定义开始 assume ds:data,cs:code start: mov ax,data ;实现段地址DATAS加载到DS mov ds,ax mo
  • 汇编程序16位带符号变量计算

    千次阅读 2017-11-27 17:49:04
    用16位指令编写完整的程序,并上机测试,计算W=(x+y)*z,其中所有变量均16位带符号变量。...定义数据段,其中X,Y,Z为一个字节,V16位结果字节code segment assume cs:code,ds:datastart: mov ax,data mov d
  • 汇编语言32位加减乘除运算题

    千次阅读 2017-08-29 20:22:28
    用16位指令编制程序,处理32位的加减乘除算术四则运算题。本文计算(3*X+Y-Z)/5的值值分别:x dw 7;大家自己定义一下数据,最好不要雷同哦!...定义数据段,其中X,Y,Z为一个字节,V32位结果双字 code seg
  • 输出hello world

    2017-12-18 21:25:00
    DATA SEGMENT ;定义数据段 string db 'Hello World',13,10,'$' ;定义个字符串,记得要以$结束标志 DATA ENDS ;数据段结束 STACK SEGMENT PARA STACK ;堆栈段定义开始 ...
  • 汇编程序学习

    2017-11-06 22:12:00
    个简单的hello world ...定义数据段,数据存放的地方,segment表段的开始,ends结束,data为段名,编译后变为地址tab db 'hello world$' ;定义变量 汇编定义变量的格式【变量名】【变量类型】【数值列表】 ...
  • 、第个汇编程序 例如:编写个汇编程序实现:x=4,y=5,z=((x+y)*8-x)/2,计算出z的结果。 思路 公式中出现的三个变量X、Y、Z是带符号数,在数据段中定义 ...数据段定义伪指令 X DW 4 ;定义X...
  • 汇编语言摘录35:伪指令dd、dup

    千次阅读 2012-12-05 19:42:12
    汇编语言摘录35:伪指令dd、dup 前面对于数据定义:db:定义字节型数据(8位);dw:定义字型数据(16位)。 dd定义dowrd(double word,双字)型数据。...第数据为01H,在data:0处,占个字节; 第二个数据为00
  • 汇编学习笔记(): Hello World! 记: 1. 刚刚开始学习汇编,作下笔记,怕日后忘记 2. int 21h等dos功能调用 功能号的作用可百度int 21h ... 定义数据段 string db 'Hello World!','$' ; db(define b
  • 汇编实现两位数相加

    万次阅读 2015-11-28 17:49:13
    本来简单的两个数相加用高级语言只是两行代码的问题,但是到了汇编语言,就需要什么考虑了,比如先定义数据段 还有代码段,...定义个变量名为data1 长度为255个字 的字符串 data2 DB 255 dup('$') ; 同上 str1
  • C/C++ 底层的一些记录心得

    千次阅读 2016-01-12 21:32:28
    1、变量的声明(declaration) 和 定义 (definition)区别 【声明】 没有赋值 只是个符号 【定义】  变量定义 ——让编译器分配内存 并给内存赋值 ...已初始化变量 —— 数据段 data segment 未初始化变量
  • 定义数据段 infon db 0dh,0ah,'Please input a year: $' ;声明空间存储输入提示信息,其中0d回车,0a换行 Y db 0dh,0ah,'This is a leap year! $' ;声明空间存储是闰年提示信息,同上另起行输出 N db 0dh,0ah,'...
  • 9.按下面的要求写出程序的框架 (1)数据段的位置从0E000H开始数据段定义一个100字节的数组其类型属性既是字又是字节 (2)堆栈段从小段开始段组名类别名STACK (3)代码段中指定段寄存器指定主程序从1000H开始给有关...
  • ;str是个以'$'结束的字符串,如下程序统计字符'A'在字符串中出现的次数,并... //data segment 定义一数据段 str DB 'AAAACAHjsjisjaidsajis','$';定义str串 在汇编中终止符是'$' c语言中是'\0' 因此定义'$'...
  • 1.第个汇编程序  1.汇编语言要用伪指令来通知汇编(编译)程序哪...用DATA指明为数据段、用CODE指明代码段,划分这两个段要用到段划分伪指令SEGMENT。用ASSUME伪指令说明段寄存器与段名之间的对应关系 2.标号...
  • 汇编语言统计字符串的长度

    千次阅读 2020-01-15 21:58:30
    数据段定义一个字符串首地址String,该字符串以”$”作为结束标志,长度不超过100个字节,统计该字符串的长度并存入Len的内存单元。 data segment String db 100,?,100 dup('$') Len db 0 data ends code ...
  • 汇编?

    2019-11-21 20:29:48
    编写子程序,把数据段中1维数组AA_1变量地址中连续8个数(1,3,5,7,2,4,6,8)读出,把每个数加2后再存入到数据段中BB_1数组开始的标号地址中去,并显示出BB_1数组中每个数来(之间用空格分开) 程序代码: DATA ...
  • JAVA基础--内存分析

    2011-09-09 21:50:00
    在JAVA中,内存的管理分为Stack—栈,Heap—堆,Data Segment数据段,Code Segment—代码段。 首先,先明确每块区域存放的是什么内容。 Stack:可以翻译堆栈区域,存放一些基本数据类型, 指令代码,常量,对象...
  • 汇编程序输出“Hello world”

    万次阅读 2012-12-30 09:31:54
    学了个学期的汇编了,该复习复习了。大后天就要开始开微机原理了。先那把些上机做过的题再拿...定义数据段 STRING DB ‘Hello World’, $; 定义一个字符串,记得要以$结束标志 DATA ENDS ;数据段结束 STACK
  • 寒假汇编语言作业(5)

    2015-01-20 16:52:00
    定义一数据段如下: data segment db 'h12E332l@L#O*&^!88nI@cE$% %$T1O m33E44E55t y77O88u!()' db '?' data ends 注意:第行字符串待处理的数据,'?'字符串结束符号。 设计程序完成如下操作...
  • 汇编输入年月日并判断是否正确定义数据段和堆栈段二、定义代码段并初始化堆栈三、从键盘获取年月日四、输出年月日五、键盘获取子程序六、打印输出子程序七、判断是否1到12月子程序七、判断大小月子程序八、...
  • K60笔记2——内存空间分布

    千次阅读 2016-12-20 19:04:21
    数据段data segment):保存全局数据和静态数据 堆(heap):给动态分配内存。当使用malloc函数分配内存时,新分配的内存就被添加到堆上, 栈(stack):存放着局部变量和函数参数等 当我们用汇编语言写程序时,...
  • 由于汇编语言的输入都会当做字符,...数据段定义 DATA SEGMENT STRING DB 15,0,15 DUP(0) ;用于存储读入的字符串 DATA1 DB 5 DUP(0) ;用于存储转换后的数据 TIP1 DB 'Input 5 numbers(H):','$' DATA E
  • 几道汇编入门题目

    2019-07-11 16:58:26
    用汇编语言编写个程序,找出在数据段中预先定义的组带符号数中的最大数和最小数,并将它们的序号显示到屏幕上(假设序号从0开始)。 例如组数据定义为: 0A5H,32H,73H, 08H,0FH,90H,0DAH,3BH 则显示...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

segment一数据段定义为data