我必须添加两个 3*3 的单词数组并将结果存储在另一个数组中。这是我的代码:
.data
a1 WORD 1,2,3
WORD 4,2,3
WORD 1,4,3
a2 WORD 4, 3, 8
WORD 5, 6, 8
WORD 4, 8, 9
a3 WORD DUP 9(0)
.code
main PROC
mov eax,0;
mov ebx,0;
mov ecx,0;
mov edx,0;
mov edi,0;
mov esi,0;
mov edi,offset a1
mov esi,offset a2
mov ebx, offset a3
mov ecx,LENGTHOF a2
LOOP:
mov eax,[esi]
add eax,[edi]
mov [ebx], eax
inc ebx
inc esi
inc edi
call DumpRegs
loop LOOP
exit
main ENDP
END main
Run Code Online (Sandbox Code Playgroud)
但这是 …
我正在为学校的程序集 8086(使用 DOSBox)开发一个项目,我试图将我的程序延迟 0.5 秒。
我尝试创建一个循环,将当前时间与初始时间进行比较,使用 int 21h、函数 2Ch 和 中的百分之一值DL,但它似乎太慢了......
mov ah, 2Ch
int 21h
mov al, dl ;hundredths
mov bx, 0
wait_loop:
one_hun:
int 21h
cmp al, dl
je one_hun
mov al, dl
inc bx
cmp bx, 50
jne wait_loop
Run Code Online (Sandbox Code Playgroud) 在查看gdb输出并查看汇编调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右到左加载,反之亦然.
通常类似于以下内容:
sub rsp, 16
Run Code Online (Sandbox Code Playgroud)
要么
sub 16, rsp
Run Code Online (Sandbox Code Playgroud)
但有时候,没有像上面这样的值可见.我所看到的只是如下调用:
(gdb) disassemble
Dump of assembler code for function main:
0x0000000100000f54 <main+4>: mov $rdi,%r15
0x0000000100000f59 <main+9>: mov $rsi,%r14
0x0000000100000f60 <main+16>: mov $rdx,%r13
0x0000000100000f67 <main+23>: mov $ecx,$r12d
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)
如何确定值是从左向右处理还是从右处理?
是否可以使用这些指令获得等于1的符号标志?
movzx ecx, byte ptr[eax]
and ecx, 8000000Fh
jns short loc_401073
Run Code Online (Sandbox Code Playgroud)
寄存器和8000000Fh and之间有一个ecx.In ecx可以是00h-FFh范围内的数字,但我不确定是否可以得到SF = 1.有人能帮助我吗?
我想添加两个存储的值 x 和 y 但我只想使用 1 寻址模式。
以下是示例:
lda x
sta x
// store the final result in x
lda y
sta y
// store the final result in y
//now I want to add x and y like x+y. Is the following pattern correct? whats wrong?
lda x
lda y
add x
sta x
Run Code Online (Sandbox Code Playgroud) 我是集会的初学者,任何帮助将不胜感激.这是我的代码:
.MODEL SMALL
.DATA
Textstring db "I'm a string$"
.CODE
START:
mov dx, Textstring
push dx
getche:
mov ah, 06h
int 21h
push al
END START
Run Code Online (Sandbox Code Playgroud)
我一直得到操作数类型在第8行上不匹配的错误,操作或指令的参数在第13行上有非法大小.
我猜测问题是我试图推进AL堆栈.无论如何我可以把内容推AL到堆栈上吗?我正在尝试创建一个代码,我提示用户输入一个字符并将该字符返回给调用它的程序.
这是我编写的代码,用于以相反的顺序将数据从一个数组移动到另一个数组.
data segment
arr1 db 10h,20h,30h,40h
arr2 db 4 dup(0)
cnt dw 04h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,arr1
lea di,arr2
mov cx,cnt
mov bp,cx
mov bx,00h
back:
mov dl,[si][bx]
mov [di+bp-1],dl
dec bp
Run Code Online (Sandbox Code Playgroud)
上面的这行代码(bp寄存器)没有加载我希望用基于索引寻址的内存.
inc bx
loop back
mov ah,4ch
int 21h
code ends
end start
Run Code Online (Sandbox Code Playgroud) NUM EQU 3
.MODEL small
.STACK
.DATA
tempi DW 8,27,17,12,21,34,9,41,7,18,15,5
risultato DW NUM DUP (?)
.CODE
.STARTUP
PUSH OFFSET tempi
PUSH OFFSET risultato
CALL copiaVettore
ADD SP,4
MOV CX, 0
MOV CX,12
LEA BX, risultato
salta:
MOV DX, [BX]
ADD DX, 30h
ADD BX, 2
MOV AH, 2h
INT 21h
LOOP salta
.EXIT
copiaVettore PROC
PUSH BP
MOV BP, SP
PUSH DI
PUSH SI
MOV DI, [BP+4] ;risultato
MOV SI, [BP+6] ;sorgente
MOV CX, 12
ciclo1:
MOV AX, [SI]
MOV …Run Code Online (Sandbox Code Playgroud) 我正在使用TASM汇编程序,我似乎找不到保存命令行参数甚至输出它们的方法.我试图做int 21h而dx=0081h和ah=09h.它没有做任何事情,虽然我已经读到它是这样做的方式.
我添加了我认为应该复制的代码并显示我输入的参数:
mov dx, 81h
mov ah, 09h
int 21h
Run Code Online (Sandbox Code Playgroud) 因此,此插入排序是用x86编写的,但嵌入在C中。它还具有一个标志,在对数组的一半进行排序后,我们将其设置为保留。有什么办法可以提高性能?
void asmInsSort(int *list, int arrayLen, int halfpoint) {
_asm
{
mov ecx, arrayLen
mov esi, list
mov ebx, halfpoint
mov eax, 0
more:
cmp ecx, 0 // Compare current arrayLen w/ 0
je done // If it is equal, we are done
mov edi, eax //J = I
push eax //push eax (i) to free up register for key
mov eax, [esi + edi] //Key = Array[i] technically j
sub edi, 4 //J - 1
mov edx, arrayLen //K …Run Code Online (Sandbox Code Playgroud) x86 assembly inline-assembly micro-optimization insertion-sort