Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >汇编语言关于2号功能函数的坑点

汇编语言关于2号功能函数的坑点

作者头像
KevinBruce
发布于 2020-03-12 08:07:07
发布于 2020-03-12 08:07:07
55700
代码可运行
举报
文章被收录于专栏:CTF及算法学习CTF及算法学习
运行总次数:0
代码可运行

汇编语言的2号功能函数有小小的坑点,需要格外注意一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov ah,2
int 21h

某些dos版本下,该功能函数会返回一个值并存在al中。

如果不注意这一点,有时候就会出错。比如如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,3633H
    call print
    MOV AH,4CH
    INT 21H
print proc
    push dx
    mov dl,ah
    ;入口参数是ax
    mov ah,2
    int 21h
    mov dl,al
    mov ah,2
    int 21h
    pop dx
    ret
print endp
CODES ENDS
    END START

理想的输出结果应该是63,而实际输出为66。

以下是debug过程的部分截图,可以验证该说法。

也可以参考如下文章: http://www.delorie.com/djgpp/doc/rbinter/id/65/25.html

文章内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Category: DOS kernel
INT 21 - DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT

    AH = 02h
    DL = character to write
    (某些版本存在返回值)
Return: AL = last character output (despite the official docs which state
        nothing is returned) (at least DOS 2.1-7.0)
Notes:  ^C/^Break are checked, and INT 23 executed if pressed
    standard output is always the screen under DOS 1.x, but may be
      redirected under DOS 2+
    the last character output will be the character in DL unless DL=09h
      on entry, in which case AL=20h as tabs are expanded to blanks
    if standard output is redirected to a file, no error checks (write-
      protected, full media, etc.) are performed
SeeAlso: AH=06h,AH=09h
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
汇编分支程序设计 ARRAY存10数据,求最大数最小数存放在MAX和MIN中
数组ARRAY存放10个字数据,求数组的最大数和最小数,并分别存放在MAX和MIN中
圆号本昊
2021/09/24
3940
8086汇编语言之dos打印hello world
代码示例 assume cs:code,ds:data,ss:stack ;数据段 代码段可直接获取数据段中数据, 相当于高级语言中的局部变量 stack segment db 20 dup(0) ;定义数据相当于是定义了段地址 stack ends ;数据段 代码段可直接获取数据段中数据, 相当于高级语言中的全局变量 data segment db 20 dup(0) ;定义数据相当于是定义了段地址 db 'hello world!$' ;$ 表示结尾标记 data ends code s
乱码三千
2021/08/24
1.1K0
【汇编】微机原理与接口技术课程设计
编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择。 (1) 按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:
zstar
2022/06/14
9910
【汇编】微机原理与接口技术课程设计
汇编语言辗转相除法求最大公约数
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
里克贝斯
2021/05/21
1.8K1
汇编语言辗转相除法求最大公约数
【汇编语言】[BX]和loop指令(三)—— Debug与masm的指令处理差异与loop,[bx]的联合应用
但是在汇编源程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理。
Crossoads
2024/11/13
1000
【汇编语言】[BX]和loop指令(三)—— Debug与masm的指令处理差异与loop,[bx]的联合应用
汇编版冒泡排序
用到的东西都很简单,只用了基本的寄存器和jmp运算。 更新补充:我自己的电脑上\n即可实现回车换行,但是有的机器不支持,需要\r\n才可以回车换行。如果测试时出现没有回车的情况,可以在对应部分的输出语句加上mov dl,13 int 21h。
KevinBruce
2020/03/11
3370
汇编语言从键盘输入一个字符串以十进制输出字符串中非字母字符的个数A to Z)
(1)从键盘输入一个字符串(串长不大于80)。 (2)以十进制输出字符串中非字母字符的个数(不是a to z或 A to Z)。 (3)输出原字符串且令非字母字符闪烁显示。 (4)找出字符串中ASCII码值最大的字符,在字符串中用红色显示。 (5)字符串的输入和结果的输出都要有必要的提示,且提示独占一行。 (6)要使用到子程序。 data segment hintinput db "please input a string:$" hintoutput1 db "The number of n
炒香菇的书呆子
2021/05/27
3.2K0
汇编串操作程序设计 计算(X+(Y*Z-100))/W
计算 (X+(Y*Z-100))/W 其中:X, Y, Z, 均为十六位有符号数,其存储形式如下, X DW -13 Y DW 30 Z DW 24 W DW 50
圆号本昊
2021/09/24
3500
DOS汇编程序提高练习
编写一个汇编程序,实现字符串的复制功能,并且将复制的字符串显示出来。(选做部分:倒
timerring
2022/07/20
8980
DOS汇编程序提高练习
【汇编语言】int指令(二)—— 从硬件到应用的桥梁:BIOS与DOS中断的最佳实践
在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS中主要包含以下几部分内容。
Crossoads
2024/12/29
1470
【汇编语言】int指令(二)—— 从硬件到应用的桥梁:BIOS与DOS中断的最佳实践
Mac下写8086汇编
我们课上讲的是8086下的16位汇编,如此远古的操作系统导致我在配置环境时遇到了很多问题。起初打算在win7虚拟机下用masm和汇编ide写汇编,但编译不成功,因为masm新版已经不是16位了。据查,masm5.0版本支持16位汇编,但又发现了DOSBox,与其在win7虚拟机下模拟DOS,不如直接在Mac中运行DOS环境。
gojam
2019/05/14
2.6K0
8086汇编语言之函数的声明和调用
由于print函数默认执行,为了保证在call时才执行, 咱们将print函数代码移至中断后:
乱码三千
2021/08/24
1.6K0
【汇编语言】外中断(二)—— 键盘的奥秘:编写自己的 int 9 中断例程
上面的过程中,第1、2、3步都是由硬件系统完成的。我们能够改变的只有int9中断处理程序。我们可以重新编写int9中断例程,按照自己的意图来处理键盘的输入。
Crossoads
2025/01/03
1090
x86汇编语言之8086语法和指令集
上面使用db或者dw定义数据的方式,定义数据的同时就已经定义好了数据所在的物理地址, 如果我们想要从指定的内存地址中写入或者读取数据的话,需要借助段寄存器来实现 在8086中给我们提供了DS SS CS ES四个寄存器,理论上你使用哪一个都行,但是由于系统默认读取DS寄存器中的数据当做段地址,所以我们一般使用DS进行数据的段地址管理
乱码三千
2021/08/24
2.6K0
【汇编语言】——基础知识(实验一)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
4210
汇编语言、与C语言、实现--汉诺塔--
   用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z,....。
书童小二
2018/09/03
1.7K0
汇编语言、与C语言、实现--汉诺塔--
汇编串操作程序设计 计算X+(Y-Z)=W
串操作程序设计 HLJU 设X、Y、Z均为双精度数,它们分别存放在X、X+2、Y、Y+2、Z、Z+2存储单元中,存放时高位存高地址,低位存低地址,编写程序实现下面表达式的计算:X+(Y-Z)=W
圆号本昊
2021/09/24
5050
汇编DOS与Windows Masm编译运行代码步骤详解
obj文件一般是Object的简写,是程序编译后的二进制文件,obj文件可称为目标文件或中间文件。另外obj文件只给出了程序的相对地址。
timerring
2022/07/20
1.4K0
汇编DOS与Windows Masm编译运行代码步骤详解
汇编语言_汇编语言程序
开头和结尾的两句代表伪指令 只有编译器可以读懂 汇编指令可以被翻译为机器码最终被cpu执行 汇编程序 就是包含汇编指令和伪指令的文本 mov ax,4c00h int 21h 跟C语言程序的return 0一样 返回控制权 一个汇编程序是由多个段组成的 这些段被用作各种空间来使用 一个有意义的汇编程序至少需要一个段 且每个段都需要段名 段名 segment--段的开始 段名 ends--段的结束 assume假设 含义是假设某一段寄存器和程序中我们定义的段名关联起来 可以理解为和变量的引用一个意思
用户7272142
2023/11/14
2380
汇编语言_汇编语言程序
收藏夹吃灰版!汇编语言快速入门(非常详细)
汇编语言程序以段为单位进行书写,一般把数据定义在数据段里,程序写在代码段中。下面给出段的定义语法:
C语言与CPP编程
2024/06/08
2880
收藏夹吃灰版!汇编语言快速入门(非常详细)
推荐阅读
相关推荐
汇编分支程序设计 ARRAY存10数据,求最大数最小数存放在MAX和MIN中
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验