我使用NASM在Linux上进行汇编编码,现在我正在尝试为Windows学习相同内容。在Ray Duncan的高级MS-DOS编程之后,图3-7列出了一个基于MASM的hello world程序,它基本上打印了#hello world"使用中断21h。这是在使用中断80h的Linux上做同样的事情的同义词,感觉像家一样。我想在Windows上使用NASM做同样的事情。
网上的大多数示例都使用Windows API,例如_GetStdHandle,_WriteConsoleA等,或者使用诸如_printf之类的C库。我想做裸露的骨头。以下内容:
global _start
section .data
str: db 'hello, world',0xA
strLen: equ $-str
section .text
_start:
mov ah,40h
mov bx,1
mov cx, strLen
mov dx, str
int 21h
mov ax,4c00h
int 21h
希望我没有模糊不清:)
答案 0 :(得分:2)
我喜欢从vitsoft上面编写上面代码的一些变体,而不使用软件中断将字符串直接打印到我们必须在下面的代码中指定的给定屏幕坐标。 (但它不会触摸或移动光标位置。)对于64位Windows,请使用DOSBOX。
; Save as hello.asm, assemble with nasm -f bin -o hello.com hello.asm
ORG 256
Start: JMP Main
strOfs DB 'hello, world'
strLen EQU $-strOfs ; meaning of $ = offset address of this position in the code
Main: MOV SI,strOfs ; offset address of the string
MOV CX,strLen ; lenght of the string
MOV AX, 0B800h ; segment address of the textmode video buffer
MOV ES, AX ; store the address in the extra segment register
MOV DI, (Line_Number*80*2)+(Row_number*2) ; target address on the screen
CLD ; let the pointer adjustment step forward for string instructions
nextChar: LODSB ; load AL from DS:[SI], increment SI
STOSB ; store AL into ES:[DI], increment DI
INC DI ; step over attribute byte
LOOP nextChar ; repeat until CX=0
MOV AH,00h ; BIOS function GET KEYSTROKE
INT 16h ; Press any key to continue
RET ; Exit program
答案 1 :(得分:-2)
如果DOS功能不足裸机,您可以在PC的固件中使用硬连线的BIOS功能。它们在http://www.ctyme.com/rbrown.htm
的拉尔夫·布朗的中断名单中有记载; Save as hello.asm, assemble with nasm -f bin -o hello.com hello.asm
ORG 256
Start: JMP Main
strOfs DB 'hello, world',0Ah
strLen EQU $-strOfs
Main: MOV SI,strOfs
MOV CX,strLen
SUB BX,BX ; clear videopage number and color
MOV AH,0Eh ; BIOS function TELETYPE OUTPUT
CLD
nextChar: LODSB ; load AL from [SI], increment SI
INT 10h ; Display one character, advance cursor position
LOOP nextChar
MOV AH,00h ; BIOS function GET KEYSTROKE
INT 16h ; Press any key to continue
RET ; Exit program