标签: x86-16

未定义的操作码对(原始)Intel 8086/88的影响

由于原始的8086和8088没有针对非法指令的软件例外,因此在输入此类指令(例如“ FF FF”(不是操作码))时会如何表现?它们是否失速,是否会自行复位,并可能在其控制总线上发出特殊的循环指示?

x86-16

5
推荐指数
1
解决办法
1289
查看次数

适用于ubuntu的8086/88模拟器

我需要在Ubuntu中模拟8086程序的程序集.

我搜索了存储库,我找到了8085模拟器,它与8086不相似.

ubuntu有8086/88汇编模拟器吗?

assembly emulation x86-16

5
推荐指数
1
解决办法
1万
查看次数

x86实模式段如何重叠有助于节省内存?

我正在教我的12 yo 8086汇编语言,昨天我们正在谈论记忆,寻址和分割.我向他展示了如何将段可视化为从16字节边界开始的重叠64Kb块序列,其中偏移是段内的8080样式指针.然后他问了一个我无法回答的问题:为什么(为什么,有什么目的)它们重叠

试图研究这个问题,我发现了20位数学的许多副本,以及一些模糊的提到这个方案可能允许的一些内存节省.有人可以详细说明内存节省部分吗?或任何其他方式来实现重叠的实际优势?

assembly memory-segmentation x86-16

5
推荐指数
1
解决办法
2714
查看次数

如果更改CS段寄存器会发生什么?(那你怎么这样做?)

我读了这篇文章:http://static.patater.com/gbaguy/day3pc.htm

它包括句子

不要改变CS !!

但是,如果修改了CS段寄存器,究竟会发生什么?为什么这么危险?

x86 assembly x86-16

5
推荐指数
1
解决办法
3799
查看次数

如何使用Turbo C在dosbox中正确分配内存缓冲区以应用双缓冲?

好的,所以我尝试在使用IDE Turbo C ++ 3.0的模拟环境(DosBox)中应用双重缓冲技术,我正在运行Windows 7 64bit(不确定是否重要),而且我不知道如何正确执行缓冲例程在这种环境下。

我遇到的主要问题是我似乎无法执行以下赋值语句:

double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);

(请注意320和200是屏幕尺寸)...我只是得到NULL分配。

我尝试将DosBox的默认RAM使用率更改为32,而不是16,但这没有任何作用。我不确定这是模拟器还是Turbo C的代码出了问题。(请注意,它符合要求)。

这是我在网上找到的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <alloc.h>

typedef unsigned char byte_t;

byte_t far* video_buffer = (byte_t far*)0xA0000000;

void vid_mode(byte_t mode){
    union REGS regs;
    regs.h.ah = 0;
    regs.h.al = mode;
    int86(0x10,&regs,&regs);
}

void blit(byte_t far* what){
    _fmemcpy(video_buffer,what,320*200);
}

int main(){

    int x,y;
    byte_t far* double_buffer;

    double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);
    if(double_buffer == NULL){
        printf("sorry, not enough memory.\n");
        return 1; …
Run Code Online (Sandbox Code Playgroud)

c dosbox turbo-c double-buffering x86-16

5
推荐指数
1
解决办法
665
查看次数

在汇编中寻址数组[di]和[array + di]之间的根本区别是什么?

给出的是英特尔8086处理器的汇编程序,它在数组中添加数字:

.model small
.stack 100h

.data
    array dw 1,2,3,1,2
    sum   dw ?,", is the sum!$"

.code
main proc
    mov ax,@data
    mov ds,ax

    mov di,0

    repeat:
    mov ax,[array+di]
    add sum,ax
    add di,2           ; Increment di with 2 since array is of 2 bytes

    cmp di,9
    jbe repeat         ; jump if di<=9

    add sum,30h        ; Convert to ASCII
    mov ah,09h
    mov dx,offset sum  ; Printing sum
    int 21h

    mov ax,4c00h
    int 21h
main endp
end  main
Run Code Online (Sandbox Code Playgroud)

上面的程序使用"base + index"寻址模式添加数组的数量.

可以通过以下方式执行相同的操作:

mov ax, …
Run Code Online (Sandbox Code Playgroud)

assembly masm x86-16 emu8086

5
推荐指数
1
解决办法
139
查看次数

使用3Dh会导致中断仅返回"已拒绝访问"

配置:

MS-DOS 16 BIT(在.asm文件中写入,然后用TASM和TLINK编译它们)

Windows 7 x64

我在Assembly中创建了一个简单的程序,它只应该打开一个文件并为其写一个文本.
这是代码:

assume cs:code, ds:data
data segment
    fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
    toWrite db "Hello World!", "$"
data ends

code segment
  writeToFile:
    ; pentru functia 3Dh
    mov AH, 3Dh
    mov AL, 0h
    mov dx, offset fileName
    int 21h
    ret


  start_program:
    mov ax, data
    mov ds, ax  
    CALL writeToFile
    mov ax, 4c00h
    int 21h
code ends

end start_program
Run Code Online (Sandbox Code Playgroud)

我用TurboDebugger看看会发生什么.奇怪的是,它总是具有AX价值0005意义Access Denied

我在互联网上可以找到的所有东西都是ASSEMBLY …

assembly dos tasm dosbox x86-16

5
推荐指数
1
解决办法
223
查看次数

8086程序中.model小的含义是什么?

我是8086汇编语言的初学者.我可以理解程序中使用的逻辑并自己编写小程序.但我只是想知道这是做什么的:

.model small
.stack 300h
Run Code Online (Sandbox Code Playgroud)

.model的解释是什么?

我在用masm.

assembly masm x86-16

5
推荐指数
2
解决办法
1万
查看次数

用于16位二进制文​​件的现代c ++?

这是一个愚蠢的问题,但是...我最近玩过djgpp并且很惊讶可以编译/链接现代c ++ 17代码到32位dos二进制文件.Mingw涵盖了win32和win64.但就win16而言,存在一个巨大的漏洞.有没有能够生成16位代码的c ++ 17编译器(用于dos,windows或任何其他操作系统)?

c++ windows x86-16 c++17

5
推荐指数
0
解决办法
131
查看次数

如何在DOS程序集中正确挂接Interrupt 28h并将其还原?

我试图将Interrupt 28h的处理程序设置为我自己的例程,恢复所有涉及的寄存器和标志,并恢复原始的Interrupt处理程序。我在VirtualBox中的DOSBox和MS-DOS 6.22下使用NASM汇编器。

我已经考虑过调试,但是在TSR程序上进行调试听起来似乎是不可能的。我尝试将数据段推到代码段上,并保存原始数据段以供以后还原,但是即使还原了数据段后,它似乎仍挂起了计算机。

section .text   ;Code Section
org 100h        ;DOS Executable Start
mov ah,35h      ;Get Interrupt Vector
mov al,28h      ;Of Interrupt 28h
int 21h         ;Call DOS Kernel
push cs         ;Push Code Segment
pop ds          ;Onto Data Segment
mov [oldseg],es ;Save Old Interrupt Vector Segment
mov [oldoff],bx ;Save Old Interrupt Vector Offset
mov ah,25h      ;Set Interrupt Vector
mov dx,resstart ;To Resstart
int 21h         ;Call DOS Kernel
mov dx,resend   ;Set Data Offset to Resend
sub dx,resstart ;Subtract Resstart
shr dx,4h       ;Shift …
Run Code Online (Sandbox Code Playgroud)

assembly dos interrupt x86-16

5
推荐指数
1
解决办法
197
查看次数