我正在编写一个需要通过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)谷歌没有提出任何有用的答案.如有必要,我可以发布我的全部代码.
我一直在尝试为“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) 我有以下代码,它采用十六进制格式的数字并打印出其十进制格式.
这个程序在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之后挂起.
我想制作一个程序,该程序需要用户输入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) 据我所知,如果我们使用带有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作为余数?
我的汇编源代码:
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 文件尽可能小。
我目前正在为大学实施 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
实际驻留的位置,因为我不知道如何指示汇编器 …
使用 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
具有相同的操作码,因为它们具有相同的标志相关行为,并且不同的助记符用于反映同一操作的不同语义,但前者让我感到困惑。
我需要拆解命令8E C0,你能帮帮我吗?
我已经做到了这个:
第一个字节8E = 10001110b它是mov sr,reg/mem
但我不知道如何处理第二个字节11000000
我有一项任务,要求我使形状移动并用颜色改变形状。我一开始就没有成功地画出圆的八分圆。假设使用 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)