【问题标题】:Interrupt 21h function ah=9h doesn't work?中断 21h 功能 ah=9h 不起作用?
【发布时间】: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 Windows64-bit Windows 的每个版本的系统调用号码

标签: assembly console output


【解决方案1】:

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.

【讨论】:

  • 等等,但我刚刚读到 10h 是一个 bios 中断,所以我认为它不会在像 windows 这样的操作系统中工作?
  • 你能不能“让 ES 指向 DS 和 BP 指向字符串偏移”?因为我真的不知道该怎么做,因为我是组装的初学者?
  • @KKZiomek : 如果您生成一个 16 位程序,当在 Windows 上运行时,该 16 位程序在 NTVDM 控制的虚拟机中运行。 NTVDM 对 BIOS 和 DOS 中断有基本的支持(不是全部,而是最常见的)。 NTVDM 当然只适用于 32 位 Windows(不是 64 位)
  • @KKZiomek 在 Windows 上,您应该将 Win32 API 视为最低级别(在许多情况下,它是 Windows 系统调用接口的精简包装器)。使用 Win API 编写 32(或 64 位)Windows 代码来进行基本输入和输出。
  • @KKZiomek :由于您正在生成 16 位代码,因此您应该使用 use16 而不是 use32
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多