由于原始的8086和8088没有针对非法指令的软件例外,因此在输入此类指令(例如“ FF FF”(不是操作码))时会如何表现?它们是否失速,是否会自行复位,并可能在其控制总线上发出特殊的循环指示?
我需要在Ubuntu中模拟8086程序的程序集.
我搜索了存储库,我找到了8085模拟器,它与8086不相似.
ubuntu有8086/88汇编模拟器吗?
我正在教我的12 yo 8086汇编语言,昨天我们正在谈论记忆,寻址和分割.我向他展示了如何将段可视化为从16字节边界开始的重叠64Kb块序列,其中偏移是段内的8080样式指针.然后他问了一个我无法回答的问题:为什么(为什么,有什么目的)它们重叠?
试图研究这个问题,我发现了20位数学的许多副本,以及一些模糊的提到这个方案可能允许的一些内存节省.有人可以详细说明内存节省部分吗?或任何其他方式来实现重叠的实际优势?
好的,所以我尝试在使用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,®s,®s);
}
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) 给出的是英特尔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) 配置:
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 …
我是8086汇编语言的初学者.我可以理解程序中使用的逻辑并自己编写小程序.但我只是想知道这是做什么的:
.model small
.stack 300h
Run Code Online (Sandbox Code Playgroud)
.model的解释是什么?
我在用masm.
这是一个愚蠢的问题,但是...我最近玩过djgpp并且很惊讶可以编译/链接现代c ++ 17代码到32位dos二进制文件.Mingw涵盖了win32和win64.但就win16而言,存在一个巨大的漏洞.有没有能够生成16位代码的c ++ 17编译器(用于dos,windows或任何其他操作系统)?
我试图将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)