这是我第一次使用Stack Overflow,所以请对这个问题保持宽容.我一直在尝试使用批处理编程并使用DOSbox在我的linux机器上运行它们.
这是我一直在使用的代码:
@echo off
set a=3
set b=4
set c=%a%+%b%
echo %c%
set d=%c%+1
echo %d%
Run Code Online (Sandbox Code Playgroud)
输出是:
3+4
3+4+1
Run Code Online (Sandbox Code Playgroud)
我如何添加两个变量而不是回显该字符串?
我在Ubuntu 12.04上的DOSBox上运行Turbo C.
问题是两个黑色条纹都出现在屏幕上.我想删除它们.
我的电脑是戴尔Studio 15z,屏幕分辨率为1366x768.即使发生扭曲,我也没有问题.
我的dosbox.conf文件的相关部分:
[sdl]
fullscreen=true
fulldouble=false
fullresolution=1366x768
windowresolution=1366x768
output=overlay
autolock=true
sensitivity=100
waitonerror=true
priority=higher,normal
mapperfile=mapper-0.74.map
usescancodes=true
Run Code Online (Sandbox Code Playgroud) 我无法让MASM接受写成的远程调用指令call 0f000h:1260h,可能是因为这个问题带来的问题.
我没有乱用神秘的MASM指令,而是决定使用DB手动将其编码到我的程序中,如下所示:
pushf ;IRET will be executed, push flags.
db 9ah,60h,12h,0,0f0h ;call location f000:1260.
;Location pointed to by int 1c (System timer tick)
;BIOS defaults it to a dummy IRET
Run Code Online (Sandbox Code Playgroud)
在使用DEBUG.COM跟踪程序时,我注意到在执行调用指令后出现"DB FE".但是,执行时不会发生这种情况int 1ch.跳转到位置f000:1260的这两种方法有什么区别?
我假设DEBUG没有将0xfe(以及后面的字节)识别为有效的操作码.我倾倒了位置f000:1260以查看哪些字节存在.
确实存在字节0xfe以及其他一些字节.我知道0xcf本身就是IRET的操作码(这是我期望找到的所有),那么这些其他字节是什么?
这是int 1ch位于0000:0070 的IVT条目.
UPDATE
正如Michael Petch在他的回答中所说,奇怪的字节构成了DOSBox的回调机制.我很想知道如果我试图在我的主程序中执行这个回调会发生什么.
执行:
xor ah, ah ;select set video mode function
mov al, 13h ;320x200 256 colors
db 0feh,38h,18h,00h ;set video mode DOSBox callback.
;Nothing pushed to stack.
Run Code Online (Sandbox Code Playgroud)
似乎与执行完全相同:
xor ah, ah …Run Code Online (Sandbox Code Playgroud) 我们被要求编写 16 位汇编代码并将其汇编以在 DOSBox 中运行。
我知道 16 位汇编代码与普通 x86 汇编代码的不同之处在于它使用bits 1616 位寄存器(ax、bx、cx、 ...)。
我尝试搜索如何将NASM 用于 16 位代码,但不幸的是不明白它在说什么。
我只是想知道NASM中使用什么参数来汇编16位汇编代码?(-bin或-obj?),然后如果可能的话,如何在 Linux 中调试它。如果不行,如何在DOSBox中调试?
我真的很想在这里得到一些帮助,因为我们得到的资源非常少来理解这一点,所以我真的很困惑。
考虑以下宏:
pixelFast MACRO
; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al.
xor bh, bh
mov ah, 0ch
int 10h
ENDM
drawRect MACRO x1, y1, x2, y2, color
LOCAL @@loop, @@row_loop
xor cx, cx
mov dx, y1
mov al, BYTE PTR [color]
@@loop:
mov cx, x1
@@row_loop:
pixelFast
inc cx
cmp cx, x2
jna @@row_loop
inc dx
cmp dx, y2
jna @@loop
ENDM
rendToolBar MACRO
drawRect COLORDISP_X1, COLORDISP_Y1, COLORDISP_X2, …Run Code Online (Sandbox Code Playgroud) 我用Turbo C++搭建了一个DOSBox开发环境,打算和朋友们一起制作一个游戏。
我正在使用 C 代码,并且想知道如何将二进制数据链接到 EXE 中。(我以前使用 C 的所有经验都是 libGBA,很抱歉,如果这实际上不可能像我想象的那样。)
如果不可能,那么嵌入二进制数据的替代选项是什么?(我真的不想在游戏目录中需要一堆二进制文件......)
找不到太多关于 Turbo C 的第三方文档,特别是考虑到我正在使用其他受支持的但不是我的 IDE 的主要语言,该语言最后一次更新是在 2000 年代初完全转移到另一个操作系统之后。
我已经在程序集8086中创建了“愤怒的小鸟”游戏。我现在的主要问题是我想在主循环运行时播放游戏的歌曲。我已经写了音乐代码。我考虑过使用多线程,但发现用于创建线程的程序集中断仅适用于cmd,不适用于DOSBox。
但是,我发现执行多线程的另一种方法是从C ++ Windows.h文件调用一个创建线程的命令。那太复杂了。
现在,我设法使用中断14h通过LAN端口发送消息,从而在两个不同的DOSBox窗口之间进行通信。基本上,我已经为音乐编写了单独的代码。这两个代码都运行,并且只有当音乐代码获得符号时,它才开始播放音乐。
但是,我发现打开两个DOSBox窗口时,只有主要的声音起作用。您必须切换窗口才能收听音乐,这意味着您听不到声音。
有没有人知道如何解决这个问题,或者在主循环运行时播放音乐?
谢谢
当我尝试在 Windows 10 中编译 DOSBox SVN Daum 时,我遇到了 VS2015 中显然新出现的与标头相关的问题。示例:
Severity Code Description Project File Line Suppression State
Error (active) the global scope has no "int_least8_t" dosbox c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdint 23
Error C2039 'int_least8_t': is not a member of '`global namespace'' dosbox C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdint 23
Run Code Online (Sandbox Code Playgroud)
我的搜索告诉我,此类问题已经发生在周围的项目中,但我无法解决它。
特别是,我阅读了VisualStudio 2015 RC Issue with Includes和https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/,然后更改了 AppData\Local 的内容\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props 到:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>D:\dev\include;$(UniversalCRT_IncludePath);$(IncludePath)</IncludePath> …Run Code Online (Sandbox Code Playgroud) 我试图编写一个引导加载程序以在 dos-box 中使用我编写了以下代码
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded
JMP $ ;infinite loop
TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0
DW 0xAA55 ; add boot signature at the end of bootloader
Run Code Online (Sandbox Code Playgroud)
我试图通过以下命令使用 nasm 组装它
nasm -f elf myfile.asm
Run Code Online (Sandbox Code Playgroud)
然后我看到那个错误
错误:无法识别的指令 [ORG]
我使用的是ubuntu 14.04 LTS,nasm的版本是2.10.09
我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.MODEL small
.STACK 16
.CODE
start:
mov ax, 044c0h
mov bl, 85
idiv bl
exit:
mov ax, 4c00h
int 21h
end start
Run Code Online (Sandbox Code Playgroud)
用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv的指令,这对于一些原因,修改cs和ip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.
有没有人对此有任何解释?