【发布时间】:2016-06-21 14:29:09
【问题描述】:
我最近开始学习汇编。我在 windows 和 ALINK 链接器下使用 NASM 程序集。
我使用 kernel32.dll 中的 win32 函数在控制台中制作了一个有效的 hello world 代码。但我想制作一个不使用win32 api而只使用中断的hello world程序。
这是我尝试过的代码(hello2.asm):
..start:
section .text use32
mov dx, msg
mov ah, 9
int 21h
mov ah, 4Ch
int 21h
section .data
msg db "Hello world!", 0Dh, 0Ah, "$"
我设置编译的批处理脚本是(hello2作为编译的输入):
@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.exe 进程在任务列表中停留了几秒钟然后消失了。
我做错了什么?正如我所说,我使用 win32 api 函数编译了工作脚本,但这次我想在没有 winapi 和 c 函数外部的情况下这样做......
【问题讨论】:
-
似乎您的程序启动和完成速度过快。添加击键读数。
-
我该怎么做呢,21小时中断中有一个函数可以读取按键吗?
-
mov ah,1,int 21h -
请注意,除非迫不得已,否则学习旧的 dos 函数是毫无意义的。
-
@PeterCordes :微软强烈反对直接使用系统调用(至少从 NT4 开始),因为它们在不同版本中的预期不同。它们通常半记录在系统头文件中。如果真的想一头撞死,有一种资源可以整合32-bit Windows 和64-bit Windows 的每个版本的系统调用号码