比较分别在数据段与附加段中的字符串以及汇编中常见的四种中断指令

1.从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出N。

这个程序调试了好久,之间遇到两个问题,其一是附加段的使用,需要对DS压栈对ES调整处理,即

1 PUSH    DS
2 MOV     AX,ES
3 MOV     DS,AX
4 ;......
5 POP      DS    

其二是,串比较指令CMPSW进行字比较,而CMPSB进行字节比较,需要区分开。(其实我现在还不明白即便是字符组成的串,进行字比较为什么会出错,有高手知道吗?)

下面是程序:

 1 DATA    SEGMENT
 2 VA DB 50,0,50 DUP(0),‘$‘
 3 V1 DB ‘Y‘
 4 V2 DB ‘N‘
 5 ENTER DB 0AH, 0DH, ‘$‘
 6 DATA    ENDS
 7 DATA2    SEGMENT
 8 VB DB 50,0,50 DUP(0),‘$‘
 9 DATA2    ENDS
10 CODE    SEGMENT
11     ASSUME CS:CODE,DS:DATA,ES:DATA2
12 START:  MOV    AX,DATA        ;装入DS
13     MOV    DS,AX
14     MOV    AX,DATA2    ;装入ES
15     MOV    ES,AX
16
17     MOV    DX,OFFSET VA    ;输入字符串VA
18     MOV     AH,0AH
19     INT    21H
20
21     PUSH    DX        ;回车换行
22     MOV     DX, OFFSET ENTER
23     MOV     AH, 09H
24     INT     21H
25     POP    DX
26
27     PUSH    DS
28     MOV    AX,ES        ;对附加段的处理
29     MOV    DS,AX
30     MOV    DX,OFFSET VB    ;输入字符串VB
31     MOV    AH,0AH
32     INT    21H
33     POP    DS
34
35     PUSH    DX        ;回车换行
36     MOV     DX, OFFSET ENTER
37     MOV     AH, 09H
38     INT     21H
39     POP    DX
40
41     LEA    SI,VA        ;把源串地址传给SI
42     PUSH    DS
43     MOV    AX,ES
44     MOV    DS,AX
45     LEA    DI,VB        ;把目的串地址传给DI
46     POP    DS
47
48     CLD            ;清除方向标志,使向前
49     MOV    CX,50        ;重复计数器
50     REPE    CMPSB        ;相等则重复,CX为0或者遇到不相等则顺序执行
51     JE    J1        ;相等则跳转
52     MOV    AH,2
53     MOV    DL,V2
54     INT    21H
55     JMP    J2
56 J1:    MOV    AH,2
57     MOV    DL,V1
58     INT    21H
59 J2:    MOV    AH,4CH
60     INT    21H
61 CODE    ENDS
62     END  START

截图:

2.下面顺便提一下常见的四种中断:

1)键盘输入字符中断

Mov ah,1

Int  21h;结果是 al←输入字符的ASCII码

2)屏幕显示一个字符中断

Mov ah,2

Mov dl,要显示字符的ASCII码

Int  21h;(注意:这里al会变为要输出的字符的ASCII码)

3)屏幕显示字符串(9号功能调用)

格式:   MOV DX, 字符串的偏移地址
     MOV AH, 09H
     INT
21H

在使用9号功能调用时,应当注意以下问题:

① 待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。

② 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。

4)键盘输入字符串(0AH号功能调用)

格式:   MOV DX, 已定义缓冲区的偏移地址
            MOV AH, 0AH
             INT 21H


执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,该个数包括回车符0DH在内。第二个字节保留,在执行程序完毕后存入输入的实际字符个数(不含回车)。从第三个字节开始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于定义的字符个数,其后输入的字符丢弃不用,一直到输入回车键为止。


应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。

举例:

时间: 2024-12-26 14:10:15

比较分别在数据段与附加段中的字符串以及汇编中常见的四种中断指令的相关文章

数据返回(数据共享,即从后端返回到前端调用,四种(requesst、ModelAndView、Model、Map))

@Controller @RequestMapping("/view")//请求父路径 public class GoodsController { @RequestMapping("/goodsReturnReq.do")//请求子路径 public String goodsReturnReq(Goods goods,HttpServletRequest request){ System.out.println("goodsReturnReq:"

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;  

Fiddler模拟post四种请求数据

前言: Fiddler是一个简单的http协议调试代理工具,它界面友好,易于操作,是模拟http请求的利器之一. 在接口测试中,接口通常是get请求或者post请求.get请求的测试一般较为简单,只需设置好相关的请求头,url写正确即可.但是在测试post请求时,请求数据格式的设置往往就稍显复杂.尤其是在开发人员的接口文档描述不清楚的情况下,会影响到测试效率. 故而本文总结了下post请求常见的四种数据格式和对应的fiddler模拟请求的构造方法. post请求主体详解: 对于get请求来说没有

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区 域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读

可执行程序包括BSS段、数据段、代码段

可执行程序包括BSS段.数据段.代码段(也称文本段). 一.BSS BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域.特点是:可读写的,在程序执行之前BSS段会自动清0.所以,未初始的全局变量在程序执行之前已经成0了. 注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量. UNIX下可使用size命令查看可执行文件的段大小信息.如size a.out. 二.数据段 在采

(转)Linux下数据段的区别(数据段、代码段、堆栈段、BSS段)

进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的.对任何一个普通进程来讲,它都会涉及到5种不同的数据段. Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BS

程序运行中(BSS段、数据段、代码段、堆栈)

程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小

LINUX下目标文件的BSS段、数据段、代码段

http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 rodata 字符串常量 参考:<程序员自我修养> 代码编译后的机器指令经常被放在代码段里,代码段名为".text";已初始化的全局变量和已初始化的局部静态变量经常放在数据段里,数据段名为".data";未初始化的全局变量和未初始化局部静态变量一般放在“.bs

C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于