我正在学习,我是汇编语言编程的初学者,我们目前正在学习字符串打印和操作显示内存。在谈论这个问题之前,我想先介绍一下背景。我们正在为iapx88(intel 8088)处理器架构制作程序,我们正在使用nasm汇编器和afd调试器。我使用的是32位Windows 7旗舰版。 我的问题是我无法在命令提示符中执行任何字符串打印程序,即使代码在调试器中正确运行。附加的图像将有助于更好地解释问题。我们的讲师告诉我们在Dos中执行程序之前运行全屏dos程序(如编辑器)或在afd中运行程序的.com文件。这些提示都没有帮助我。这是我们编写的字符串打印程序之一:
; program in assembly to display 'hello world' on screen
[org 0x0100]
push cs
pop ds
jmp start
message: db 'hello world' ; string to be printed
length: dw 11 ; length of the string
; subroutine to clear the screen
clrscr: push es
push ax
push di
mov ax, 0xb800
mov es, ax ; point es to video base
mov di, 0 ; point di to top left column
nextloc: mov word [es:di], 0x0720 ; clear next char on screen
add di, 2 ; move to next screen location
cmp di, 4000 ; has the whole screen cleared
jne nextloc ; if no clear next position
pop di
pop ax
pop es
ret
; subroutine to print a string at top left of screen
; takes address of string and its length as parameters
printstr: push bp
mov bp, sp
push es
push ax
push cx
push si
push di
mov ax, 0xb800
mov es, ax ; point es to video base
mov di, 0 ; point di to top left column
mov si, [bp+6] ; point si to string
mov cx, [bp+4] ; load length of string in cx
mov ah, 0x07 ; normal attribute fixed in al
nextchar: mov al, [si] ; load next char of string
mov [es:di], ax ; show this char on screen
add di, 2 ; move to next screen location
add si, 1 ; move to next char in string
loop nextchar ; repeat the operation cx times
pop di
pop si
pop cx
pop ax
pop es
pop bp
ret 4
start: call clrscr ; call the subroutine
mov ax, message
push ax ; push address of message
push word [length] ; push message length
call printstr ; call the printsr subroutine
mov ax, 0x4c00 ; terminate program
int 0x21
这就是我们被告知如何制作该程序的.com文件:
nasm hello.asm -o hello.com -l hello.lst
我将所有程序文件与我的D:驱动器中的nasm汇编程序保存在同一文件夹“Assembly”中。这是当我尝试在CMD中执行程序时会发生什么: 首先,我输入程序的名称:(http://i.imgur.com/rTWUxrJ.png) 按“Enter”后:(http://i.imgur.com/UWoH0LM.png)
我希望我已经很好地解释了我的问题。我试图谷歌解决这个问题,但我找不到一个。如果你们能帮助我并告诉我我的代码出错了,我会非常感谢你。 感谢。
答案 0 :(得分:2)
您正在使用Windows来执行DOS程序。这可能会或可能不会工作(如果您使用的是64位版本的Windows,则不会)。我建议你先运行COMMAND.COM
,然后从中运行你的程序。
更新:我刚刚尝试过,但它没有用。做了以下工作:
似乎Windows中包含的DOS VM在执行EXE程序之前不会映射文本屏幕内存。将再次测试您的程序,但转换为EXE应用程序,看看我是否正确。
UPDATE2:忘记EXE / COM问题。这并不是说。这只是DOS VM无法以文本模式3启动,这就是您正在使用的模式。要切换到文本颜色模式,请在调用clrscr
以下代码之前在程序开头添加:
mov ax,3
int 10h ;select 80x25 color text mode