标签: tasm

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
查看次数

相对跳转超出范围 0020h 字节

我一直在尝试为“shell”编写一个基本的com文件。我只需稍加修改就能在NASM中汇编相同的代码。

然而这段代码不会在TASM中汇编!我得到了这样的错误:相对跳转超出范围我在谷歌上查了一下以了解跳转。然而,除了将这个跳跃分成相对较短的跳跃的想法之外,我找不到太多东西。有更简洁的选择吗?

这是代码:

.model tiny

CR  equ 13d
LF  equ 10d
TAB equ 09d

.data

prompt      db CR,LF,"Input : ",0
tab_max     db 7 dup('_'),0
input       db 128 dup(0)   ; Input Buffer Of 80 Bytes
str_ver     db CR,LF,CR,LF,CR,"        ",\
           "Version : 1.0",CR,LF,0
str_help    db CR,LF,CR,LF,CR,"        ",\
           "Type VER For Version !!!",\
           CR,LF,CR,"        ",\
           "Type CLS To Clear Screen !!!",\
           CR,LF,CR,"        ",\
           "Type HELP To Display This Message !!!",\
           CR,LF,0
str_welcome db "Welcome To My Operating System …
Run Code Online (Sandbox Code Playgroud)

assembly dos tasm x86-16

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

TASM程序输出垃圾,可能会在退出时挂起

我有以下代码,它采用十六进制格式的数字并打印出其十进制格式.

这个程序在Turbo Debugger中运行得很好,但是当我在DOS下运行它时,在输出数字后输出中会看到一些额外的符号:

.model small
.stack 100h
.486
.code

save proc
    itm:
        xor dx,dx
        mov bx,10
        div bx
        add dl,30h
        inc cx
        pop bx
        push dx
        push bx
        cmp ax,0
        jne itm
   ret
save endp

start:
    mov ax, 0FFFFh
    call save
    mov ah, 02
    print:
        pop dx
        int 21h
        loop print
       int 20h
end start
Run Code Online (Sandbox Code Playgroud)

输出:

C:\TASM>lab31 65535 ò ???  9°????UWSîÄPA÷0ó?????ê$?ó????ê$ó??ê?ë?ó???sÄ÷?t? ? ÷??8sê¬ê²?&mî??????÷ t<sÿ????I?>?b!??4&Gê&_ë?î?[?é? z?? ?\?? ?f?[?3¡ïA1èG????uè ç???é????ëX?????Y^?Z? ?tÇ5????á???? ? ??! C?(A?1?:?ÿ?ƒ??[%??C???? 1357                46$??

如你所见,65535打印正常,但随后出现垃圾.当我在Turbo Debugger中运行程序时,它在写出65535之后挂起.

assembly dos real-mode tasm x86-16

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

将值保存在汇编中的var字节中

我想制作一个程序,该程序需要用户输入10个字符并将其保存在矢量DATA中,但出现错误

无法添加相对数量

mov byte ptr DATA[pos], al当我尝试保存的价值。
如何解决这个错误?

 .model small
 .stack 100h
 .data
   DATA db 10 dup(?)
   cont db 010h
   pos db 0h
   msg db 10,13,7, 'Input: ', '$'

.code
 mov ax, @data
 mov ds, ax
 mov es, ax

mov ah, 09h
lea dx, msg
int 21h

cicle:  
  mov ah, 01h
  int 21h

  mov byte ptr DATA[pos], al   ;Save ASCII char in position pos in DATA

  inc pos
  dec cont 
jnz cicle
Run Code Online (Sandbox Code Playgroud)

assembly tasm x86-16

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

当我们将 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
查看次数

在 TASM 理想模式下设置数据段的对齐方式

我的汇编源代码:

ideal 
model tiny 
segment _data byte  ; TASM doesn't accept it. 
ends _data 
 
dataseg 
align 1  ; Doesn't decrease the segment alignment. 
lpText  db "Hello, world!$" 
 
codeseg 
        startupcode 
        lea dx,[lpText] 
        mov ah,9 
        int 21h 
        exitcode 
end 
Run Code Online (Sandbox Code Playgroud)

TASM 5.0 给了我错误段属性非法重新定义其中的行byte

如何在理想模式下将数据段更改为字节对齐?

我需要它,因为我不希望在lpText前面生成的 .com 文件中有一个额外的 0 字节。我希望 .com 文件尽可能小。

x86 assembly dos tasm x86-16

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

TASM 寻址减一

我目前正在为大学实施 Snake,为此我们必须使用 TASM。

我的主要游戏数据是这样排列的(使用 C 语法):

struct GameLine {
    uint8_t direction_bits[10];  // 2 bits per entry, the first entry is invalid since valid x positions start at one
    uint8_t collision_bits[5];  // 1 bit per entry, the first entry is again invalid but has to stay zero
    uint8_t aux;  // padding such that GameLine is 16 bytes big, also used to store other information at times.
};

struct GameData {
    struct GameLine lines[23];
} PHYSICAL_GAME_DATA;
Run Code Online (Sandbox Code Playgroud)

问题是每帧写入方向位会覆盖大 x 位置的读取冲突位(38 是最大位置,但它发生得更早)。我说“读取冲突位”是因为我无法验证physical_game_data实际驻留的位置,因为我不知道如何指示汇编器 …

memory assembly tasm off-by-one x86-16

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

x86 子指令操作码混淆

使用 Turbo Assembler 和 Turbo Debugger 稍微玩了一下,我对操作码感到惊讶。更准确地说,我有一些组装好的二进制文件,Turbo Debugger 在其中反汇编了这个词

29 C3
Run Code Online (Sandbox Code Playgroud)

正确地sub bx, ax. 但是,Turbo Assembler 将完全相同的指令组装sub bx, ax到以下单词中

2B D8
Run Code Online (Sandbox Code Playgroud)

对此感到困惑,我发现这个参考文献指出从寄存器中减去寄存器可能确实以29和开头2B。是否真的可以用不同的操作码来表达完全相同的指令?如果是这样,那是为什么?是因为历史原因和兼容性吗?参考说明了操作码的不同操作数类型,它们只是sub bx, ax. 这是为了以后通过自修改代码或类似方式修补不同操作数的能力吗?此外,Turbo Assembler 是否有语法结构来选择一个操作码而不是另一个?

注意:我知道条件跳转类似je并且jz具有相同的操作码,因为它们具有相同的标志相关行为,并且不同的助记符用于反映同一操作的不同语义,但前者让我感到困惑。

x86 assembly opcode tasm instruction-encoding

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

反汇编命令8E C0

我需要拆解命令8E C0,你能帮帮我吗?

我已经做到了这个:

第一个字节8E = 10001110b它是mov sr,reg/mem

但我不知道如何处理第二个字节11000000

x86 assembly tasm mov

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

我无法在具有直接内存访问的 8086 程序集中使用中点算法绘制圆

我有一项任务,要求我使形状移动并用颜色改变形状。我一开始就没有成功地画出圆的八分圆。假设使用 Intel 8086 汇编语言,在 DMA 模式下使用 TASM。(模式 19)我在想如果我能完成一个圆圈,我可以给它设置动画并改变形状。我无法弄清楚是算法错误还是代码错误。

.model small
.stack 256

.code 
startaddr   dw  0a000h  ;start of video memory   
color   db  3 
xc dw  160
yc dw 100
r dw  50 ; radius
x dw 0 
y dw 50 ;radius
pk dw 1
temp dw 1

plot macro r1, r2, r3 ;x,y,color
    mov ax, r2
    mov bx, 320
    mul bx
    add ax, r1
    mov di, ax
    mov al, r3
    mov es:[di], al
endm

start:    
  mov ax, yc
  add y, …
Run Code Online (Sandbox Code Playgroud)

assembly tasm x86-16

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