新学汇编,int 21h求助 ,8086 16位汇编

时间:2022-07-30 01:00:21
stack segment stack
db 200 dup(0)
stack ends

data segment
bufA db 'abcdefg'
bufB db 20 dup(0)
data ends

code segment
assume cs:code , ds:data , ss:stack
START:
mov ax , data
mov ds , ax
mov cx , 7
lea si , bufA
lea di , bufB
L:
mov ax , [si]
mov [di] , ax
inc di
inc si
dec cx
jne L

mov cx , 7
lea di , bufB
WRITE:
mov dl , [di]
mov ah , 2h
int 21h

mov dl,0ah
mov ah , 2h
int 21h

inc di 
dec cx
jne WRITE
code ends
end START

上述代码的目的是拷贝buffA到bufferB,并将bufferB中的字符输出。
两个问题:
1. 上述代码第一次汇编后执行输出一堆乱码,之后执行无任何输出。
2. 使用重定向命令可看到输出,汇编后可执行文件为 asm.exe , 则asm.exe > t.txt命令后,txt文件有输出,输出内容为
Invalid keyboard code specified
a
b
c
d
e
f
g

本来是不想输出回车的,之前以为是未“刷新”输出缓冲区的问题,但是输出回车后依然没变化。

新学汇编,诸位不要见笑

10 个解决方案

#1


loop循环自动递减CX的值, 不需要你手工dec的。
start:
        mov ax,data
        mov ds,ax
        mov cx,7
        lea si,bufA
        lea di,bufB
L:
        mov al,[si]
        mov [di],al
        inc si
        inc di
        loop L

        mov cx,7
        mov ah,2
        lea si,bufB
Write:
        mov dl,[si]
        int 21h
        inc si
        loop Write

#2


如果要显示有回车效果可以加个打印回车符就可以啦

Write:
        mov dl,[si]
        int 21h
        mov dl,0dh
        int 21h
        inc si
        loop Write

#3


我的代码有什么问题吗? 不用loop的话为什么重定向可以看到输出,直接执行程序没有输出呢?重定向输出为什么有一个Invalid keyboard code specified输出呢?

#4


引用楼主 wushichao1987 的回复:
Assembly code
stack segment stack
    db 200 dup(0)
stack ends

data segment
    bufA db 'abcdefg'
    bufB db 20 dup(0)
data ends

code segment
    assume cs:code , ds:data , ss:stack
STA……

主要问题:

1. 用AX一次移动一个字,就不需要循环7次了。所以改为用AL一次移一个字节。

2. 只有回车没有换行造成的。输出0ah是回车符,它把光标定位到当前行的最左边,换行符0dh则是把光标定位到下一行的同一列上。

你的程序只回车不换行,所以后面的字符把前面的字符都覆盖掉了。

#5


你的程序只回车不换行,所以后面的字符把前面的字符都覆盖掉了。
=====================================================================
不输出回车一样,还是重定向有输出,直接在console下执行无输出,我前面提到的“本来是不想输出回车的,之前以为是未“刷新”输出缓冲区的问题,但是输出回车后依然没变化。”就是说这个意思。

#6


刚才办公楼要锁门,没很仔细看。

你的程序最后没有返回OS的指令,执行完你的程序,又执行未知指令去了。

#7


   这么简单个小程序 整的神神秘秘的 

#8


刚才办公楼要锁门,没很仔细看。

你的程序最后没有返回OS的指令,执行完你的程序,又执行未知指令去了
=======================================================================
it really work , thanks

#9


这么简单个小程序 整的神神秘秘的
=====================================
标题小神秘,下次改正,哈哈

#10


为什么我没看到这个?

mov ax,4c00h
int 21h

#1


loop循环自动递减CX的值, 不需要你手工dec的。
start:
        mov ax,data
        mov ds,ax
        mov cx,7
        lea si,bufA
        lea di,bufB
L:
        mov al,[si]
        mov [di],al
        inc si
        inc di
        loop L

        mov cx,7
        mov ah,2
        lea si,bufB
Write:
        mov dl,[si]
        int 21h
        inc si
        loop Write

#2


如果要显示有回车效果可以加个打印回车符就可以啦

Write:
        mov dl,[si]
        int 21h
        mov dl,0dh
        int 21h
        inc si
        loop Write

#3


我的代码有什么问题吗? 不用loop的话为什么重定向可以看到输出,直接执行程序没有输出呢?重定向输出为什么有一个Invalid keyboard code specified输出呢?

#4


引用楼主 wushichao1987 的回复:
Assembly code
stack segment stack
    db 200 dup(0)
stack ends

data segment
    bufA db 'abcdefg'
    bufB db 20 dup(0)
data ends

code segment
    assume cs:code , ds:data , ss:stack
STA……

主要问题:

1. 用AX一次移动一个字,就不需要循环7次了。所以改为用AL一次移一个字节。

2. 只有回车没有换行造成的。输出0ah是回车符,它把光标定位到当前行的最左边,换行符0dh则是把光标定位到下一行的同一列上。

你的程序只回车不换行,所以后面的字符把前面的字符都覆盖掉了。

#5


你的程序只回车不换行,所以后面的字符把前面的字符都覆盖掉了。
=====================================================================
不输出回车一样,还是重定向有输出,直接在console下执行无输出,我前面提到的“本来是不想输出回车的,之前以为是未“刷新”输出缓冲区的问题,但是输出回车后依然没变化。”就是说这个意思。

#6


刚才办公楼要锁门,没很仔细看。

你的程序最后没有返回OS的指令,执行完你的程序,又执行未知指令去了。

#7


   这么简单个小程序 整的神神秘秘的 

#8


刚才办公楼要锁门,没很仔细看。

你的程序最后没有返回OS的指令,执行完你的程序,又执行未知指令去了
=======================================================================
it really work , thanks

#9


这么简单个小程序 整的神神秘秘的
=====================================
标题小神秘,下次改正,哈哈

#10


为什么我没看到这个?

mov ax,4c00h
int 21h