我最近开始学习装配。我在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的情况下编写它...
答案 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.