该装配项目读取按键并以特定颜色输出它们。当按下一个元音时,它会改变文本的颜色,直到按下另一个元音为止,直到 ESC按下为止。颜色具有一定的模式,这就是为什么sub colorCode, 8当它到达循环结束时。我只是想让它更有效率。我尝试将所有比较语句放入一行,但没有成功。
INCLUDE Macros.inc
INCLUDE Irvine32.inc
INCLUDELIB Irvine32.lib
.386
.STACK 4096
ExitProcess PROTO, dwExitCode:DWORD
.DATA
key BYTE ?
colorCode BYTE 5
max BYTE 13
.CODE
main PROC
FindKey:
mov EAX, 50
call Delay
call ReadKey
jz FindKey
MOV key, AL
cmp key, 75h
JE UP
CMP key, 6Fh
JE UP
CMP key, 69h
JE UP
CMP key, 65h
JE UP
CMP key, 61h
JE UP
CMP key, 55h
JE UP
CMP key, 4Fh
JE UP …Run Code Online (Sandbox Code Playgroud) 我目前正在学习汇编语言,我有一个输出"Hello World!"的程序.:
section .text
global _start
_start:
mov ebx, 1
mov ecx, string
mov edx, string_len
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
string db "Hello World!", 10, 0
string_len equ $ - string
Run Code Online (Sandbox Code Playgroud)
我理解这段代码的工作原理.但是,现在,我希望显示10倍的线.我在互联网上看到的代码循环如下:
mov ecx, 5
start_loop:
; the code here would be executed 5 times
loop start_loop
Run Code Online (Sandbox Code Playgroud)
问题:我试图在我的代码上实现循环,但它输出一个无限循环.我还注意到循环需要ECX和写入功能也需要ECX.显示10次"Hello World!"的正确方法是什么??
这是我当前的代码(产生无限循环):
section .text
global _start
_start:
mov ecx, 10
myloop:
mov ebx, 1 ;file descriptor
mov ecx, string
mov …Run Code Online (Sandbox Code Playgroud) 我是一个初学者,正在学习组装基础知识。现在,在阅读此问题时,我来到了这一段。它说明了如何将浮点数存储在内存中。
浮点数的指数是8位字段。为了允许存储大数或小数,将指数解释为正数或负数。实际指数是8位字段的值减去127。127是32位浮点数的“指数偏差”。浮点数的分数字段让人有些意外。由于将0.0定义为所有设置为0的位,因此无需担心将0.0表示为等于127的指数字段并将小数字段设置为所有O。所有其他数字至少具有一个1位,因此IEEE 754格式使用隐式1位来节省空间。因此,如果小数字段为00000000000000000000000,则将其解释为1。00000000000000000000000。这允许分数字段有效地为24位。
我一点都不明白。
您能解释一下它们如何存储在内存中吗?我不需要参考,我只需要一个很好的解释即可轻松理解。
我的任务是编写一个显示程序PSP线性地址的程序.我写了以下内容:
ORG 256
mov dx,Msg
mov ah,09h ;DOS.WriteStringToStandardOutput
int 21h
mov ax,ds
mov dx,16
mul dx ; -> Linear address is now in DX:AX
???
mov ax,4C00h ;DOS.TerminateWithExitCode
int 21h
; ------------------------------
Msg: db 'PSP is at linear address $'
Run Code Online (Sandbox Code Playgroud)
我搜索了DOS api(使用Ralph Brown的中断列表)并没有找到输出数字的单个函数!我错过了吗,我该怎么办?
我想以DX:AX十进制显示数字.
我是初学者,所以这段代码可能没什么用,我用过int 16h这个,但我对此了解不多int。我刚刚发现你不能同时敲击多个按键;有什么帮助吗?
这段代码的问题是一次只能移动一块板,而我需要两块板。如何检查多个输入?
这是任何想要它的人的代码:
Run Code Online (Sandbox Code Playgroud)IDEAL MODEL small STACK 100h DATASEG ; -------------------------- ; Your variables here ; -------------------------- line1X dw 80 line1Y dw 120 line1start dw 5 line1end dw 10 line2X dw 80 line2Y dw 120 line2start dw 310 line2end dw 315 CODESEG proc startVideo ;creates video mode mov al,13h mov ah,0h int 10h ret endp startVideo proc clearScrean ;turns the screen black mov ah, 0ch xor al,al mov dx,200 BlankLine: mov cx,320 BlankColumn: int 10h …
我是汇编程序新手,所以这是一个简单的问题:
我的自定义子例程更改X、Y和A寄存器。他们操纵这些来产生期望的结果。在例程启动时将这些值推入堆栈并在之前恢复它们是一个好主意吗RTS?
我的意思是,这样我就可以编写可以从任何地方调用的例程,而不会弄乱“状态”或影响其他例程。但是这样使用栈可以吗?或者有更好的方法来做到这一点吗?
在 NASM (2.14.02) 中,指令add rbx, 0xffffffff导致
警告:有符号双字值超出界限 [-w+number-overflow]
我知道 64 位模式下的算术逻辑运算仅接受 32 位常量,但 0xffffffff 仍然是 32 位宽。
为什么 NASM 发出警告,为什么它假设一个有符号常量?它是否将 32 位符号扩展-1为 64 位-1(0xffffffffffffffff)并因此出现溢出?0x7fffffff 工作时不会发出警告。
我能以某种方式说服 NASM 这不是一个有符号常量,而是一个无符号常量吗?
一些小丑(BIOS/DOS/TSR ......)在中断向量表中写入了随机数据.我知道这是因为拆卸告诉了我.
通常在占用中断向量之前,我验证所选的IVT插槽是空的.但是,有了所有这些留下来的数据,一个不起眼的应用程序如何知道钩住特定的中断向量仍然是安全的?
虽然我的程序员参考描述了DOS功能25小时SetInterruptVector为
" 安全地修改中断向量以指向指定的中断处理程序"
我不认为这种预先存在的虚假内容太过关注.到目前为止安全!
是否有一些巧妙的方法可以绝对确定中断向量是免费的?
这是我编写的代码的一部分:
section .data
name db 'slm dada',0xa
lenname equ $-name
nane db 'bye '
section .text
global _start
_start:
mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h
mov eax, [nane] <- My questions are about
mov [name], dword eax <- these 2 lines
mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h
mov eax, 1
int 0x80
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
有没有办法不使用EAX寄存器将nane变量的值移动到name变量?
为什么我们需要使用类型修饰符?
我目前正在使用MASM在DOSBox上进行汇编编程(16位)。
我所知道的是:
这是您声明字符串的方式:
var db 'abcde'
Run Code Online (Sandbox Code Playgroud)
这是您声明数组的方式:
var db 'a','b','c'
Run Code Online (Sandbox Code Playgroud)
我不确定这些是否正确,并且我对这两者(数组和字符串)感到困惑
mov ah,9
int 21h
Run Code Online (Sandbox Code Playgroud)
上面的代码显示输出字符串而不输出数组吗?