汇编语言关于2号功能函数的坑点
<p>汇编语言的2号功能函数有小小的坑点,需要格外注意一下。</p><pre><code class="language-asm">mov ah,2
int 21h
</code></pre>
<p>某些dos版本下,该功能函数会返回一个值并存在al中。</p>
<p>如果不注意这一点,有时候就会出错。比如如下代码:</p>
<pre><code class="language-asm">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
</code></pre>
<p>理想的输出结果应该是63,而实际输出为66。</p>
<p>以下是debug过程的部分截图,可以验证该说法。</p>
<p><img src="https://img2018.cnblogs.com/blog/1482461/201910/1482461-20191013214956060-809917700.png"></p>
<p>也可以参考如下文章:<br>
http://www.delorie.com/djgpp/doc/rbinter/id/65/25.html</p>
<p>文章内容</p>
<pre><code class="language-txt">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
</code></pre><br><br>
来源:https://www.cnblogs.com/kevinbruce656/p/11668623.html
頁:
[1]