标签: x86-16

8086 TASM:非法索引模式

我正在编写一个需要通过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 assembly tasm x86-16

3
推荐指数
1
解决办法
5039
查看次数

x86实模式如何在内存<640K的机器上运行?

这个问题主要是出于历史兴趣,但我一直无法找到任何有关它的文档.我在x86实模式下可以找到的所有文档(包括英特尔手册[1]和在线存储器映​​射[2])都假定系统内​​存为640KiB.然而,最初的IBM PC只有16KiB或64KiB的RAM [3].

这是怎么回事?两个具体问题:

  1. 如果访问的内存不存在,CPU的行为如何?英特尔手册[1]指出,对于实模式,某些指令会触发#GP(一般保护故障)"如果内存操作数有效地址超出CS,DS,ES,FS或GS段限制",并且对于其他人,"如果操作数的任何部分位于从0到FFFFH的有效地址空间之外." 这似乎并不表明您可以获得#GP来访问不存在的良好寻址的内存.那么在这种情况下CPU会做什么?
  2. 根据存储器映射[2],BIOS通常将MBR加载到0x7c00,该存储器空间位于仅具有16KiB RAM的原始"廉价"IBM PC的存储器空间之外.它是如何应对这一点的?(BIOS设计最初是不是将代码加载到0x7c00?)

[1] http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

[2] http://wiki.osdev.org/Memory_Map_(x86)

[3] http://en.wikipedia.org/wiki/IBM_Personal_Computer#PC

x86 osdev x86-16

3
推荐指数
1
解决办法
287
查看次数

使用汇编代码播放音乐

我正在做一个实验室项目,但遇到了一个小问题。我已经写了一些代码来演奏音符,该部分似乎起作用。我遇到的问题是我要为音乐处理'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)

audio assembly tasm dosbox x86-16

3
推荐指数
1
解决办法
5286
查看次数

x86汇编Langauge中点圆算法

您好我一直在尝试使用x86汇编程序使用中点圆算法绘制一个圆圈,我已经非常接近(我认为),我已经跟着另一个非常类似于这个问题:

使用8086汇编语言绘制圆圈

这有助于解决我遇到的其他问题.但是,我不是一个圆圈,我有基本的形状,但它似乎是凹的.

[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)

x86 assembly geometry x86-16

3
推荐指数
1
解决办法
574
查看次数

MASM错误带有16b代码的未知重定位类型(1)

我很擅长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)

x86 assembly masm masm32 x86-16

3
推荐指数
1
解决办法
142
查看次数

在DOSBox中打开文件句柄会清除文件的数据

在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)

assembly dosbox x86-16

3
推荐指数
1
解决办法
72
查看次数

为什么我得到另一个结果?

我试图为学校解决这个项目,当我使用编译器时,最终结果是一些图释而不是数字总和

我重写了整个代码,但是得到了相同的结果

.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)

assembly dos x86-16

3
推荐指数
1
解决办法
49
查看次数

INT 10H 功能 06H 移动光标

我在上运行以下汇编代码(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宏似乎正在移动光标,因为屏幕上打印的最终文本不是从角落开始的。 …

assembly x86-16 emu8086

3
推荐指数
1
解决办法
361
查看次数

当我们将 16 位数字除以 8 位 1 时会发生什么?

据我所知,如果我们使用带有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作为余数?

assembly tasm integer-division x86-16

3
推荐指数
1
解决办法
2147
查看次数

x86_32 虚拟 8086 和实模式是否支持扩展通用和专用寄存器?

是否可以在 x86_32 虚拟 8086 或实模式下使用EAX, EBX,... ?我知道,这些寄存器具有32位(和,即当然它们的非扩展部分是16个比特宽)的尺寸,但并不在类解释的,在该模式中可以使用它们,只有FSGS是仅在保护模式下允许。

x86 assembly real-mode cpu-registers x86-16

3
推荐指数
1
解决办法
82
查看次数