我正在编写一个需要通过TASM v3.1编译的8086汇编程序.我遇到了一个我似乎无法解决的错误.
我的数据段具有以下用于键盘输入的设置:
paraO Label Byte
maxO DB 5
actO DB ?
dataO DB 5 dup('$')
Run Code Online (Sandbox Code Playgroud)
我想要做的是输入第一个字符,所以dataO的第一个字节:
lea dx, dataO
mov bl, [dx]
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,我收到此错误:
**Error** h5.asm(152) Illegal indexing mode
Run Code Online (Sandbox Code Playgroud)
第152行是"mov bl,[dx]"
任何帮助将不胜感激.如果重要,我通过DOSBox运行TASM(我的笔记本电脑运行64位Win7)谷歌没有提出任何有用的答案.如有必要,我可以发布我的全部代码.
这个问题主要是出于历史兴趣,但我一直无法找到任何有关它的文档.我在x86实模式下可以找到的所有文档(包括英特尔手册[1]和在线存储器映射[2])都假定系统内存为640KiB.然而,最初的IBM PC只有16KiB或64KiB的RAM [3].
这是怎么回事?两个具体问题:
[1] http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
我正在做一个实验室项目,但遇到了一个小问题。我已经写了一些代码来演奏音符,该部分似乎起作用。我遇到的问题是我要为音乐处理'm'键,当我按它时,音乐会按预期播放。但是,我需要处理另一个键或按钮来暂停音乐,再次按下该音乐(第二次)时,音乐应该继续播放,就在它停下来的位置。我真的不知道如何处理第二个按键,因此音乐将继续播放,并且不会重新开始。我正在使用GUI Turbo汇编程序,这是到目前为止我所拥有的代码的核心:
TITLE MUSIC.EXE
STACKSG SEGMENT PARA STACK 'Stack'
DW 128 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
DATASG ENDS
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG, ES:NOTHING
SOUND PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H
OUT 43H, AL
MOV DX, 14H
MOV AX, 4F38H
DIV DI
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
MOV AH, AL
OR AL, 3
OUT 61H, AL
L1: MOV CX, 6801 …Run Code Online (Sandbox Code Playgroud) 您好我一直在尝试使用x86汇编程序使用中点圆算法绘制一个圆圈,我已经非常接近(我认为),我已经跟着另一个非常类似于这个问题:
这有助于解决我遇到的其他问题.但是,我不是一个圆圈,我有基本的形状,但它似乎是凹的.
] 1
我试图在wiki上复制C代码示例,如下所示:
C:
void drawcircle(int x0, int y0, int radius)
{
int x = radius;
int y = 0;
int err = 0;
while (x >= y)
{
putpixel(x0 + x, y0 + y);
putpixel(x0 + y, y0 + x);
putpixel(x0 - y, y0 + x);
putpixel(x0 - x, y0 + y);
putpixel(x0 - x, y0 - y);
putpixel(x0 - y, y0 - x);
putpixel(x0 + y, y0 - x);
putpixel(x0 + x, y0 - y); …Run Code Online (Sandbox Code Playgroud) 我很擅长M68000,但X86对我来说很困难.我正在尝试用MASM组装这个简单的程序
.MODEL SMALL
.data?
ONE dB ?
TWO dB ?
stack db 100 dup(?)
.data
MSG db 13,10, 'Enter deree of polynomials: $'
MSG2 db 13,10, 'Enter coefficient of x^ $'
MSG3 db 13,10, 'The polynomial created is: $'
MSG4 db 13,10, 'The first derivative is: $'
STR1 db 255 DUP('$')
.code
_start:
mov ax, offset MSG
mov ds, ax
end _start
Run Code Online (Sandbox Code Playgroud)
我一直收到符号MSG的错误未知重定位类型(1).我知道这是什么(当位移大于模型允许的位置或类似的东西时发生)但我不知道如何解决这个错误(我知道MASM是一个32位汇编程序,我正在尝试写一个16位代码).我想要做的是将指向.data的指针加载到ds寄存器中.
我makeit.bat的MASM32 IDE生成的是:
@echo off
if exist "derivative 1.obj" del "derivative 1.obj"
if exist "derivative 1.exe" …Run Code Online (Sandbox Code Playgroud) 在DOSBox 0.74中,当我尝试使用int 21h的函数3ch打开任何文件上的文件句柄时,文件的数据被清除,永久减少到0字节大小.
我测试过的文件都位于Windows 10的文档目录中,该目录在DOSBox中作为驱动器E安装.
这是导致问题的代码.它应该打开,然后关闭文件句柄.CF永远不会设置,所以没有错误代码.AX中的文件句柄设置为5.
mov ax, varData
mov ds, ax ;Load the variable segment into ds
;word variable handle is defined here
;string fname is defined here
mov ah, 3ch ;select open file handle function
lea dx, fname ;dx points to file's name ("TESTFILE")
mov cl, 1 ;read only
int 21h ;open the file handle
mov handle, ax ;copy handle into variable
mov ah, 3eh ;close handle function
mov bx, handle ;closing previously opened file handle
int 21h …Run Code Online (Sandbox Code Playgroud) 我试图为学校解决这个项目,当我使用编译器时,最终结果是一些图释而不是数字总和
我重写了整个代码,但是得到了相同的结果
.model small
.stack 100h
.data
nstr db 6 dup(' ')
idv dw 10
a dw 2
b dw 9
c dw 6
x dw ? ;x=a+b+c
d dw 7
e dw 5
y dw ? ;y=d+e
z dw ? ;z=x+y
.code
.start
mov ds, ax
; x = a+b+c
mov ax, a
add ax, b
add ax, c
mov x, ax
; y = d+e
mov ax, d
add ax, e
mov y, ax
; z = x+y …Run Code Online (Sandbox Code Playgroud) 我在上运行以下汇编代码(emu8086):
clearScr macro
mov ah, 06h
mov al, 00h
mov bh, 71h
mov cx, 0000h
mov dx, 184fh
int 10h
clearScr endm
print macro string
mov ah, 09h
lea dx, string
int 21h
print endm
.model small
.stack 100h
.data
msg db 'Hello, world!', '$'
nl db 0AH, 0DH, '$'
myname db 'Ahmed', '$'
.code
main proc
mov ax, @data
mov ds, ax
print myname
clearScr
print msg
mov ax, 4c00h
int 21h
main endp
Run Code Online (Sandbox Code Playgroud)
并且clearScr宏似乎正在移动光标,因为屏幕上打印的最终文本不是从角落开始的。 …
据我所知,如果我们使用带有8位数字的div指令,那么商是存储在AL中的8位数字,余数也是存储在AH中的8位数字
但是如果我们将 16 位数字除以 1 呢?
每当执行下面的代码时,我的指令指针就会丢失。
MOV AX, 9999H
MOV BL, 1
DIV BL
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以强制8086在除以AX时使用ax作为商并使用ax作为余数?
是否可以在 x86_32 虚拟 8086 或实模式下使用EAX, EBX,... ?我知道,这些寄存器具有32位(和,即当然它们的非扩展部分是16个比特宽)的尺寸,但并不在类解释的,在该模式中可以使用它们,只有FS和GS是仅在保护模式下允许。