中断21h功能啊= 9h不起作用?

时间:2016-06-21 14:29:09

标签: assembly console output

我最近开始学习装配。我在Windows和ALINK链接器下使用NASM程序集。

我使用kernel32.dll中的win32函数在控制台中创建了一个工作问候世界代码。但我想在不使用win32 api的情况下制作一个hello world程序,但只使用中断。

这是我试过的代码(hello2.asm):

@echo off
title asm
echo Wpisz plik/sciezke pliku .asm bez rozszerzenia do kompilacji:
set/p "file=>> "
echo.
echo Nacisnij dowolny przycisk...
pause >nul
cls
echo Kompilowanie 1 pliku...
ping localhost -n 2 > nul
echo Tworzenie pliku .obj ...
ping localhost -n 2 > nul
nasm -f obj %file%.asm
echo Tworzenie pliku .exe ...
ping localhost -n 2 > nul
alink -oPE %file%.obj
echo.
echo Sukces!
pause>nul
cls
echo Otworzyc skompilowany plik? (tak/nie)
set/p "jak=>> "
if %jak%==tak %file%
if %jak%==nie exit
exit

我设置编译的批处理脚本是(hello2作为编译输入):

{{1}}

它似乎完美地编译,但是当我运行程序时,唯一能做的就是屏幕上的所有窗口都没有焦点,并且没有控制台出现。 hello2.exe进程在任务列表中持续几秒钟并消失。

我做错了什么?正如我所说的,我使用win32 api函数编译了工作脚本,但这次我想在没有winapi且没有c函数extern的情况下编写它...

1 个答案:

答案 0 :(得分:0)

使用int 10h显示字符串,并使用int 16h读取密钥:

msg db 'abcdef'  ;STRING DEFINED IN DATA SECTION.

mov ax, data     ;DATA SEGMENT ADDRESS.
mov ds, ax
mov es, ax       ;ES = DS.

mov ah, 13h      ;SERVICE TO DISPLAY STRING WITH COLOR.
mov al, 0        ;DON'T REMEMBER WHAT THIS IS FOR.
mov bh, 0        ;VIDEO PAGE.
mov bl, 14       ;COLOR.
mov cx, 6        ;STRING LENGTH.
mov dl, 10       ;SCREEN COLUMN (X).
mov dh, 10       ;SCREEN ROW (Y).
mov bp, msg      ;STRING OFFSET.
int 10h          ;DISPLAY STRING AT ES:BP.

mov ah, 0
int 16h          ;WAIT FOR A KEY.