我想在 emu8086 程序集中创建一个简单的程序,提示用户输入一个值。然后就会显示出用户的价值。显示用户的值后,会显示一条消息。但是,我的问题是我无法显示用户的价值。这是我的代码:
org 100h
.model small
.data
a db "Enter your favorite number; $"
b db "Your favorite number is $"
c db "My favorite song is Blinding Lights by The Weeknd$"
.code
mov ax,@data
mov ds, ax
;Displaying a
lea dx,a
mov ah,09h
int 21h
;User input
mov ah,01
int 21h
mov ah,01
int 21h
;Newline
mov dx,13
mov ah,2
int 21h
mov dx,10
mov ah,2
int 21h
;Displaying b
lea dx,b
mov ah,09h
int 21h
;Displaying User's input
mov dl,al
mov ah,2h
int 21h
mov dl,al
mov ah,2h
int 21h
;Newline
mov dx,13
mov ah,2
int 21h
mov dx,10
mov ah,2
int 21h
;Displaying c
lea dx,c
mov ah,09h
int 21h
ret
Michael 已经告诉过你了你的代码的基本问题。
这是解决问题的方法:
BH
和 BL
。DL
中设置这些值。无需在这里使用较长的DX
注册。call
。lea dx, SomeLabel
,那些 mov dx, offset SomeLabel
指令会获得更短的编码(从 4 个字节到 3 个字节)。org 100h
告诉我们您正在为 DOS 编写 .COM 可执行文件。这样的程序首先将所有四个段寄存器设置为彼此相同。您不需要那个 mov ax,@data
mov ds,ax
组合。也没有必要提及 .model
,但如果你这样做,对于 .COM 文件格式来说就是 .model tiny
。ORG 100h ; .COM <=> CS=DS=ES=SS
; Displaying a
mov dx, offset a
mov ah, 09h
int 21h
; User input
mov ah, 01h
int 21h
MOV BH, AL
mov ah, 01h
int 21h
MOV BL, AL
call Newline
; Displaying b
mov dx, offset b
mov ah, 09h
int 21h
; Displaying User's input
mov dl, BH
mov ah, 02h
int 21h
mov dl, BL
mov ah, 02h
int 21h
call Newline
; Displaying c
mov dx, offset c
mov ah, 09h
int 21h
ret
Newline:
mov DL, 13
mov ah, 02h
int 21h
mov DL, 10
mov ah, 02h
int 21h
ret
a db "Enter your favorite number; $"
b db "Your favorite number is $"
c db "My favorite song is Blinding Lights by The Weekend$"